UOJ Logo tl_xujiayi的博客

博客

#621求调

2023-09-12 18:35:36 By tl_xujiayi
#include<bits/stdc++.h>
using namespace std;
int h[500001],nxt[1000001],val[1000001],zd[1000001],cnt=0;
int n,m,s;
long long dis[500001];
bool inq[500001];
int q[10000001],f,e;
void addedge(int a,int b,int c){
    cnt++;
    val[cnt]=c,zd[cnt]=b,nxt[cnt]=0;
    nxt[cnt]=h[a];
    h[a]=cnt;
}
signed main(){
    cin>>n>>m>>s;
    for(int i=1;i<=m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        addedge(a,b,c);
    }
    memset(dis,-1,sizeof(dis));
    dis[s]=0,inq[s]=1;
    q[1]=s,f=1,e=1;
    while(f<=e){
        int u=q[f++];
        for(int p=h[u];p;p=nxt[p]){
            int v=zd[p],c=val[p];
            if(dis[v]==-1||dis[v]>dis[u]+c){
                dis[v]=dis[u]+c;
                if(inq[v]==0)q[++e]=v,inq[v]=1;
            }
        }
        inq[u]=0;
    }
    for(int i=1;i<=n;i++){
        if(dis[i]!=-1)printf("%d ",dis[i]);
        else printf("-1 ");
    }
}

写了个 SPFA 过不了,求助 /kk

评论

ChaseDream
1. 输出的时候要开 long long,用 %lld 输出 2. 队列 q 大小不够,改成 1e8 之后能多过一个点 3. SPFA 本来就没法通过这题,第三个点就 TLE 了
SBuoj
f
dengruixun
@kkksc03
dengruixun
用$Floyd$试试

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。