萌新刚学会开电脑,这道题只有73分,求助qwq

P1462 通往奥格瑞玛的道路

Nelson @ 2019-09-29 20:56:40

#include<bits/stdc++.h>
using namespace std;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(isdigit(c)){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}

const int N=5e4+10;
const int inf=1e9+10;
int n,m,b,mid,maxcost,ans,cnt;
int fa[N],cost[N],judge[N],head[N<<1],dis[N];
struct edge{
    int to,next,w;
}e[N<<1];
struct node{
    int pos,len;
    bool operator<(const node &x)const{
        return x.len<len;
    }
};
priority_queue<node> q;
void addedge(int from,int to,int w){
    e[++cnt]=(edge){to,head[from],w};
    head[from]=cnt;
}
int find(int x){
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
void dij(){
    maxcost=cost[1];
    dis[1]=0;
    q.push((node){1,0});
    while(!q.empty()){
        int u=q.top().pos;
        q.pop();
        if(judge[u]) continue;
        judge[u]=1;
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].to,w=e[i].w,l=cost[v];
            if(l>mid) continue;
            maxcost=max(maxcost,l);
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(!judge[v]){
                    q.push((node){v,w});
                }
            }
        }
    }
}
int main(){
    n=read();m=read();b=read();
    ans=inf;
    for(int i=1;i<=n;i++){
        fa[i]=i;
        cost[i]=read();
    }
    for(int i=1,x,y,z;i<=m;i++){
        x=read();y=read();z=read();
        addedge(x,y,z);
        addedge(y,x,z);
        fa[find(x)]=find(y);
    }
    if(fa[find(1)]!=fa[find(n)]){
        printf("AFK");
        return 0;
    }
    int l=0,r=inf;
    while(l<=r){
        mid=(l+r)>>1;
        maxcost=0;
        for(int i=1;i<=n;i++){
            dis[i]=inf;
            judge[i]=0;
        }
        dij();
        if(dis[n]>b){
            l=mid+1;
        }
        else{
            r=mid-1;
            ans=min(ans,maxcost);
        }
    }
    printf("%d",ans);
    return 0;
}

我的思路大概就是二分+dijkstra,但是不知道咋有三个点炸了。 https://www.luogu.org/problem/P1462


by Nelson @ 2019-09-29 21:09:22

@辰星凌 开了之后好像没有什么改变呢 [ : >


by Nelson @ 2019-09-29 21:10:23

啊我知道为什么了,我那个判无解的地方没有搞好呢 此贴终结。


by Nelson @ 2019-09-29 21:10:34

谢谢各位


by Nelson @ 2019-09-29 21:15:44

虽然不知道错在哪,但最后特判了一下答案没找到的情况(=inf),输出AFK就过了。 也许是并查集写的有问题。


by 辰星凌 @ 2019-09-29 21:15:53

@Nelson 突然意识到我之前开 \text{int WA}是因为爆 \text{inf}


上一页 |