http://acm.pku.edu.cn/JudgeOnline/problem?id=3169參考 http://www.shnenglu.com/Darren/archive/2009/07/20/90649.html寫的Bellman_Ford
 code #include <iostream> #include <algorithm> #include <vector> #include <string> using namespace std; const int maxn=20000+10; const int maxd=10000+10; const int inf=2000000; struct Edge { int u,v,w; Edge(int u=0,int v=0,int w=0): u(u),v(v),w(w) {} }; Edge edge[maxn]; int s=0; int n,ml,md; int dist[maxd]; int Bellman_Ford() { bool flag; for(int i=1;i<=n;i++) dist[i]=inf; dist[1]=0; for(int i=1;i<=n;i++) //松弛n遍。如果沒有負(fù)權(quán)回路,則最多只要松弛n-1遍即可。如果第n遍仍可松弛,說明有負(fù)權(quán)回路 { flag=0; for(int j=0;j<s;j++) { int u=edge[j].u,v=edge[j].v,w=edge[j].w; if(dist[u]+w<dist[v]) { dist[v]=dist[u]+w; flag=1; } } if(!flag) break; //說明已經(jīng)沒有邊可以松弛了 } if(flag) return -1; //說明第n遍循環(huán)中,仍有邊可以松弛,說明有負(fù)權(quán)回路 else if(dist[n]==inf) return -2; else return dist[n]; } int main() { int u,v,w; scanf("%d%d%d",&n,&ml,&md); while(ml--) { scanf("%d%d%d",&u,&v,&w); edge[s++]=Edge(u,v,w); } while(md--) { scanf("%d%d%d",&u,&v,&w); edge[s++]=Edge(v,u,-w); } printf("%d\n",Bellman_Ford()); }
|