通往奥格瑞玛的道路

题目链接:通往奥格瑞玛的道路


水题。

二分最大的城市值,跑最短路,判断是否有解即可。


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;
}
发布了579 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104309076