80pts WAon #5 #8 #11 #13求条
查看原帖
80pts WAon #5 #8 #11 #13求条
780312
_xdd_楼主2024/8/24 10:31
#include<bits/stdc++.h>
#define maxn 10005
#define maxm 50005
#define maxb 1000000005
#define int long long
using namespace std;
int n,m,b,f[maxn],head[maxn],dis[maxn],cnt;
bool vis[maxn];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
struct node{
    int next,to,w;
}edge[maxm<<1];
void addedge(int u,int v,int w){
    edge[cnt++].next=head[u];
    edge[cnt].to=v;
    edge[cnt].w=w;
    head[u]=cnt;
}
bool check(int x){
    if(x<f[1]){return 0;}
    for(int i=1;i<=n;i++){
        dis[i]=1e9;
        vis[i]=0;
    }
    dis[1]=0;
    q.push(make_pair(0,1));
    while(q.size()){
        int u=q.top().second;
        q.pop();
        if(!vis[u]){
            vis[u]=1;
            for(int i=head[u];i;i=edge[i].next){
                int v=edge[i].to;
                if(f[v]<=x && dis[v]>dis[u]+edge[i].w){
                    dis[v]=dis[u]+edge[i].w;
                    if(!vis[v]){
                        q.push(make_pair(dis[v],v));
                    }
                }
            }
        }
    }
    return dis[n]<=b;
}
signed main(){
    cin >> n >> m >> b;
    for(int i=1;i<=n;i++){
        cin >> f[i];
    }
    for(int i=1;i<=m;i++){
        int a,b,c;
        cin >> a >> b >> c;
        addedge(a,b,c);
        addedge(b,a,c);
    }
    if(!check(maxb)){
        cout << "AFK";
        return 0;
    }
    int l=1,r=maxb;
    while(l<=r){
        int mid=l+r>>1;
        if(check(mid)){
            r=mid-1;
        }else{
            l=mid+1;
        }
    }
    cout << l;
}
2024/8/24 10:31
加载中...