SPFA可以处理带负边权的图,可以判负环,然而SPFA容易被卡,即使加了各种优化。
队列优化的贝尔福德曼:裸SPFA
//SPFA #include<bits/stdc++.h> using namespace std; int head[1000005],d[1000005],l,n,m,s; bool sign[1000005]; queue<int> q; struct node { int to,next,val; } a[1000005]; void add(int from,int to,int v) { a[++l].to=to; a[l].val=v; a[l].next=head[from]; head[from]=l; } void spfa() { for(register int i=1; i<=n; i++) d[i]=12345678; d[s]=0; sign[s]=1; q.push(s); while(q.size()) { int x=q.front(); q.pop(); sign[x]=0; for(register int i=head[x]; i; i=a[i].next) { int cs=a[i].to,hl=a[i].val; if(d[cs]>d[x]+hl) { d[cs]=d[x]+hl; if(!sign[cs]) { sign[cs]=1; q.push(cs); } } } } } int main() { scanf("%d%d%d",&n,&m,&s); for(register int i=1; i<=m; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } spfa(); for(register int i=1; i<=n; i++) if(i==s)cout<<0<<' '; else printf("%d ",d[i]); return 0; }