这题为何72分?求助!

P1462 通往奥格瑞玛的道路

铁锤 @ 2019-07-22 14:30:56

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
#define maxn 100005
#define pii pair<int ,int >
priority_queue<pii ,vector<pii> ,greater<pii> > q;
int u1[maxn],v1[maxn],u2[maxn],v2[maxn],head[10005],nxt[maxn],vis[maxn];
ll w1[maxn],w2[maxn],b[10005],c[10005];
ll dis[10005];
int n,m;
ll hp;
const ll inf=1000000005;
int check(int x) {
    if(x<b[1]||x<b[n]) return 0;
    for(int i=1;i<=n;i++) {
        dis[i]=inf;
    }
    for(int i=1;i<=n;i++) {
        if(x<=b[i])
            vis[i]=1;
        else
            vis[i]=0;
    }
    dis[1]=0;q.push(make_pair(0,1));
    while(!q.empty()) {
        int u=q.top().second;q.pop();
        if(vis[u])
            continue;
        vis[u]=1;
        for(int i=head[u];i;i=nxt[i]) {
            int v=v2[i];
            if(dis[u]+w2[i]<dis[v]) {
                dis[v]=dis[u]+w2[i];
                q.push(make_pair(dis[v],v));
            }
        }
    }
    if(dis[n]<=hp) return 1;
    return 0;
}
int main() {
    scanf("%d%d%lld",&n,&m,&hp);
    for(int i=1;i<=n;i++) {
        scanf("%lld",&b[i]);
        c[i]=b[i];
    }
    sort(c+1,c+n+1);
    int cnt=0;
    for(int i=1;i<=m;i++) {
        scanf("%d%d%lld",&u1[i],&v1[i],&w1[i]);
        cnt++;
        nxt[cnt]=head[u1[i]];
        head[u1[i]]=cnt;
        v2[cnt]=v1[i],w2[cnt]=w1[i];
        cnt++;
        nxt[cnt]=head[v1[i]];
        head[v1[i]]=cnt;
        v2[cnt]=u1[i],w2[cnt]=w1[i];
    }
    if(!check(c[n])) {
        printf("AFK\n");
        return 0;
    }
    int l=1,r=n,mid;
    while(l<=r) {
        mid=(l+r)>>1;
        if(check(c[mid])) {
            ans=c[mid];
            r=mid-1;
        }
        else l=mid+1;
    }
    printf("%lld",c[l]);
    return 0;
}

by 潆汐 @ 2019-07-25 18:07:26

对于100%的数据,满足ci≤1000000000,fi≤1000000000,可能有两条边连接着相同的城市。 你加一个特判,if(u1[i]==v1[i])continue;应该就行了


by yu55555 @ 2019-08-24 15:27:46

我也72,5,8,11过不去


|