题目链接:通往奥格瑞玛的道路
水题。
二分最大的城市值,跑最短路,判断是否有解即可。
AC代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10,M=1e5+10;
int n,m,bd,f[N],a[M],b[M],c[M],d[N],l,r=1e9;
int head[N],nex[M],to[M],w[M],tot;
inline void ade(int a,int b,int c){to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;}
inline void add(int a,int b,int c){ade(a,b,c); ade(b,a,c);}
inline int Dijkstra(){
priority_queue<pair<int,int> > q; q.push({0,1}); int vis[N]={0}; memset(d,0x3f,sizeof d); d[1]=0;
while(q.size()){
int u=q.top().second; q.pop();
if(u==n) return d[n];
if(vis[u]) continue; vis[u]=0;
for(int i=head[u];i;i=nex[i]){
if(d[to[i]]>d[u]+w[i]){
d[to[i]]=d[u]+w[i]; q.push({-d[to[i]],to[i]});
}
}
}
return d[n];
}
inline int check(int mid){
tot=0; memset(head,0,sizeof head);
for(int i=1;i<=m;i++) if(f[a[i]]<=mid&&f[b[i]]<=mid) add(a[i],b[i],c[i]);
return Dijkstra()<=bd;
}
signed main(){
cin>>n>>m>>bd;
for(int i=1;i<=n;i++) scanf("%lld",&f[i]);
for(int i=1;i<=m;i++) scanf("%lld %lld %lld",&a[i],&b[i],&c[i]);
while(l<r){
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
if(l==1e9) puts("AFK");
else cout<<l;
return 0;
}