91分求助!

P1462 通往奥格瑞玛的道路

sparrowbot @ 2021-07-12 12:49:48

#include<bits/stdc++.h>
using namespace std;
const int ma=1000000001;
struct node{
    int ne,a,b,re;
} Q[100010];
priority_queue<int,vector<int>,greater<int> >q;
int n,m,tp,tot,ans;
int A[10010],B[10010],C[10010];
int head[10010];
bool f[10010];
void ad(int a,int b,int c){
    Q[++tot].a=a;
    Q[tot].b=b;
    Q[tot].re=c;
    Q[tot].ne=head[a];
    head[a]=tot;
    return;
}
bool check(int x){
    if(x<A[1]||x<A[n]) return false;
    for(int i=1;i<=n;i++){C[i]=ma;}
    for(int i=1;i<=n;i++){if(A[i]>x) f[i]=1;else f[i]=0;}
    C[1]=0;
    q.push(1);
    while(!q.empty()){
        int v=q.top();
        q.pop();
        if(f[v]) continue;
        f[v]=true;
        for(int i=head[v];i;i=Q[i].ne){
            if(C[Q[i].b]>Q[i].re+C[v]){
                C[Q[i].b]=Q[i].re+C[v];
                q.push(Q[i].b);
            }
        }
    }
    if(C[n]<=tp) return true;
    else return false;
}
int main(){
    cin>>n>>m>>tp;
    for(int i=1;i<=n;i++){
        cin>>A[i],B[i]=A[i];
    }
    for(int i=1;i<=m;i++){
        int a,b,re;
        cin>>a>>b>>re;
        if(a==b) continue;
        ad(a,b,re);
        ad(b,a,re);
    }
    sort(B+1,B+n+1);
    if(!check(B[n])){
        cout<<"AFK\n";
        return 0;
    }
    int l=1,r=n,mid;
    ans=B[n];
    while(l<=r){
        mid=(l+r)/2;
        if(check(B[mid])){
//  cout<<"F**K!\n";
            ans=B[mid];
            r=mid-1;
        }
        else{
            l=mid+1;
        }
    }
    cout<<ans<<endl;
    return 0;
}

by spdarkle @ 2021-07-23 10:36:52

用SPFA,dij不能处理负权边,而题目没有说不存在负权


by spdarkle @ 2021-07-23 10:38:12

其他的不用改


by spdarkle @ 2021-07-23 10:38:30

@sparrowbot


by sparrowbot @ 2021-07-23 18:04:45

谢谢


|