0分求助,悬赏关注,谢谢
查看原帖
0分求助,悬赏关注,谢谢
546681
lcbridgeAK CSP-S楼主2023/4/1 20:31

感觉思路没啥问题呀?

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100000+5;
const int maxm=200000+5;
int n,m,s,dis[maxn],f[maxn],b,maxx;
struct edge{
	int to,w;
};
vector <edge> g[maxm];
priority_queue <pair<int,int> > q;
bool vis[maxn]; 
bool dij(int k){
	if(k<f[1])return false;
	for(int i=1;i<=n;i++)dis[i]=0x7ffffffff;
	dis[1]=0;
	q.push(make_pair(0,1));
	while(!q.empty()){
		int x=q.top().second;
		q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=0;i<g[x].size();i++){
			int to=g[x][i].to;
			if(f[to]>k)continue;
			if(dis[to]>dis[x]+g[x][i].w){
				dis[to]=dis[x]+g[x][i].w;
				q.push(make_pair(-dis[to],to));
			}
		} 
	}
	return dis[n]>=b;
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&b);
	for(int i=1;i<=n;i++){
		scanf("%lld",&f[i]);
		maxx=max(maxx,f[i]);
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		g[u].push_back({v,w});
		g[v].push_back({u,w});
	}
	int l=0,r=maxx+1,mid,ans=-1;
	while(l<=r){
		mid=(l+r)>>1;
		if(dij(mid)){
			r=mid-1;
			ans=mid;
		}
		else l=mid+1;
	}
	if(ans==-1)printf("AFK");
	else printf("%lld",ans);
	return 0;
}   
2023/4/1 20:31
加载中...