SPFA!
关于SPFA,他复活了
#include<bits/stdc++.h> using namespace std; int tot,n,s,w[100005],son[100005],next[100005]; int fir[100005],q[100005],vis[100005],d[100005]; void add(int x,int y,int z){ w[++tot]=z; son[tot]=y; next[tot]=fir[x]; fir[x]=tot; } void spfa(){ memset(vis,0,sizeof(vis)); for(int i=1;i<=10000;i++){ d[i]=2147483647; } int head=0,tail=1; q[1]=s,d[s]=0; while(head!=tail){ head=head%n+1; int x=q[head]; vis[x]=0; for(int i=fir[x];i;i=next[i]){ if(d[son[i]]>d[x]+w[i]){ d[son[i]]=d[x]+w[i]; if(!vis[son[i]]) tail=tail%n+1,q[tail]=son[i],vis[son[i]]=1; } } } } int main(){ scanf("%d%d%d",&n,&m,&s); int a,b,c; for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); } spfa(); for(int i=1;i<=n;i++){ if(i==s) cout<<0<<' '; else{ cout<<d[i]<<' '; } } return 0; }