Dijkstra+二分80pts求调
查看原帖
Dijkstra+二分80pts求调
717971
liuyi0905楼主2023/12/31 09:26

WA #5 #8 #11 #12

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,m,b,f[N],dis[N];
bool vis[N];
struct edge{
	int to,w;
	bool operator<(const edge&a)const{return w>a.w;}
};
vector<edge>nbr[N];
int dijkstra(int x){
	fill(dis+1,dis+n+1,1e18);
	fill(vis+1,vis+n+1,0);
	dis[1]=0;
	priority_queue<edge>pq;
	pq.push({1,0});
	for(;!pq.empty();){
		int cur=pq.top().to;
		pq.pop();
		if(vis[cur])continue;
		vis[cur]=1;
		for(auto [to,w]:nbr[cur]){
			if(f[to]>x)continue;
			if(dis[to]>dis[cur]+w){
				dis[to]=dis[cur]+w;
				pq.push({to,dis[to]});
			}			
		}
	}
	return dis[n];
}
signed main(){
	cin>>n>>m>>b;
	int l,r=0;
	for(int i=1;i<=n;i++)cin>>f[i],r=max(r,f[i]);
	l=max(f[1],f[n]);
	for(;m;m--){
		int u,v,w;
		cin>>u>>v>>w;
		nbr[u].push_back({v,w});
		nbr[v].push_back({u,w});
	}
	for(;l+1<r;){
		int mid=l+r>>1;
		if(dijkstra(mid)>b)l=mid;
		else r=mid;
	}
	if(dijkstra(l)>b)cout<<"AFK";
	else cout<<l;
	return 0;
}
2023/12/31 09:26
加载中...