第八个点莫名WA

P1462 通往奥格瑞玛的道路

七喜 @ 2018-10-03 12:21:30

如题,程序如下

#include<bits/stdc++.h>
using namespace std;
#define reg register
#define N 10010

int n,m,s,f[N],d[N];
int _min[N],ans;
bool vis[N];
int head[N],tot;
struct lll{int nxt,from,to,l;}c[100010];
priority_queue<int,vector<int>,greater<int> >q;

void add(int u,int v,int l){
    c[tot].from=u;
    c[++tot].to=v;
    c[tot].l=l;
    c[tot].nxt=head[u];
    head[u]=tot;
}

bool Dij(int exp){
    if(exp<f[1]||exp<f[n]) return 0;
    for(int i=1;i<=n;i++) {
        _min[i]=1000000010;
        if(f[i]>exp) vis[i]=1;
        else vis[i]=0;
    }
    _min[1]=0;q.push(1);
    while(!q.empty()) {
        int now=q.top();
        q.pop();
        if(vis[now]) continue;
        vis[now]=1;
        for(reg int i=head[now];i;i=c[i].nxt)
            if(_min[c[i].to]>_min[now]+c[i].l) {
                _min[c[i].to]=_min[now]+c[i].l;
                q.push(c[i].to);
            }
    }
    if(_min[n]<=s) return 1;
    return 0;
}

int main(){
    scanf("%d%d%d",&n,&m,&s);
    for(reg int i=1;i<=n;i++) {
        scanf("%d",&f[i]);
        d[i]=f[i];
    }
    for(reg int i=1;i<=m;i++) {
        int ai,bi,ci;
        scanf("%d%d%d",&ai,&bi,&ci);
        if(ai==bi) continue;
        add(ai,bi,ci);
        add(bi,ai,ci);
    }
    sort(d+1,d+n+1);
    int l=1,r=n,mid;
    if(!Dij(d[n])) {
        printf("AFK\n");
        return 0;
    }
    ans=d[n];r=n;
    while(l<=r) {
        mid=(l+r)/2;//>>1
        if(Dij(d[mid])) {
            ans=d[mid];
            r=mid-1;
        }
        else l=mid+1;
    }
    printf("%d\n",ans);
    return 0;
}

|