求救大佬,只有30分

P1462 通往奥格瑞玛的道路

VIOLET__FOREVER @ 2022-06-28 14:07:21

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
ll x,y,z,n,m,b,l,r,mid,ans=1e9+10,v[100005];
struct node{
    ll to,next,value;
}edgn[100005];
ll head[100005],tot,dist[100005];
bool be[100005];
void add(int x,int y,int v){
    tot++;
    edgn[tot].to=y;
    edgn[tot].value=v;
    edgn[tot].next=head[x];
    head[x]=tot;
}
bool di(int flag){
    for(int i=2;i<=n;i++){
        dist[i]=0x3f3f3f3f;
        be[i]=0; 
    }
    be[1]=0;
    priority_queue<PII,vector<PII>,greater<PII> > heap;
    heap.push({0,1});
    while(!heap.empty()){
        PII w=heap.top();
        heap.pop();
        int ver=w.second;
        if(be[ver]) continue;
        be[ver]=1;
        for(int i=head[ver];i!=0;i=edgn[i].next){
            int x=edgn[i].to;
            if(v[x]<=flag && dist[x]>dist[ver]+edgn[i].value){
                dist[x]=dist[ver]+edgn[i].value;
                heap.push({dist[x],x});
            }
        }
    }
    if(dist[n]>b) return 0;
    else return 1;
}
int main(){
    cin>>n>>m>>b;
    for(int i=1;i<=n;i++) cin>>v[i];
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    sort(v+1,v+1+n);
    l=1,r=n;
    while(l<=r){
        mid=(l+r)>>1;
        if(di(v[mid])){
            ans=v[mid];
            r=mid-1;
        }
        else l=mid+1;
    }
    if(ans==1e9+10){
        cout<<"AFK";
        return 0;
    }
    cout<<ans;
    return 0;
} 

|