有点没搞懂怎么就只有36分了

P1462 通往奥格瑞玛的道路

ztz_cpp @ 2019-08-02 16:30:58

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e4+10;
const int maxm=5e4+10;
const int inf=2e9+10;

int n,m,b;
int ans;

int f[maxn];
int s[maxn];

priority_queue<pair<int,int> >q;
int dis[maxn];
bool vis[maxn];

struct edge{
    int next,to,v;
}e[maxm<<1];
int head[maxn],tot;

void add(int x,int y,int z){
    tot++;
    e[tot].next=head[x];
    e[tot].to=y;
    e[tot].v=z;
    head[x]=tot;
}

bool ok(int ss){
    if(ss<f[1] || ss<f[n])
        return 0;
    for(register int i=1;i<=n;i++)
        dis[i]=inf;
    for(register int i=1;i<=n;i++)
        if(f[i]>ss)
            vis[i]=1;
        else
            vis[i]=0;
    dis[1]=0;
    q.push(make_pair(0,1));
    while(!q.empty()){
        int x=q.top().second;
        q.pop();
        if(vis[x])
            continue;
        vis[x]=1;
        for(register int i=head[x];i;i=e[i].next){
            int y=e[i].to;
            int z=e[i].v;
            if(dis[y]>dis[x]+z){
                dis[y]=dis[x]+z;
                q.push(make_pair(-dis[y],y));
            }
        }
    }
    if(dis[n]<=b)
        return 1;
    else
        return 0;
}

int main(){
    int x,y,z;
    scanf("%d%d%d",&n,&m,&b);
    for(register int i=1;i<=n;i++){
        scanf("%d",&f[i]);
        s[i]=f[i];
    }
    for(register int i=1;i<=n;i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    sort(s+1,s+n+1);
    if(!ok(s[n]))
        puts("AFK");
    else{
        ans=n;
        int l=1,r=n;
        while(l<=r){
            int mid=(l+r)>>1;
            if(ok(s[mid])){
                ans=mid;
                r=mid-1;
            }
            else
                l=mid+1;
        }
        printf("%d\n",s[ans]);
    }
    return 0;
}

|