本篇文章中,bellmanFord代码有一半都是判断负权回路。复制粘贴无误。
核心代码:
vector <node>::iterator it; for (it=map[j].begin();it!=map[j].end();it++) { node e= *it; if (e.w!=inf && dist[e.to]>dist[j]+e.w) dist[w.to]=dist[j]+e.w; }
如此下来,只需要将dist数组初始化,就可以实现了。完整代码如下,仅供参考。
1 #include <cstdio> 2 #include <vector> 3 using namespace std; 4 5 const int MAXN=200; 6 const int inf=0x3f3f3f3f; 7 struct node { 8 int to,w; 9 }; 10 vector <node> map[MAXN]; 11 int m,n,dist[MAXN]; 12 13 bool ford(int s) { 14 int i,j,k; 15 for (i=1;i<=n;i++) dist[i]=inf; 16 dist[s]=0; 17 for (i=1;i<=n-1;i++) { 18 for (j=1;j<=n;j++) { 19 if (dist[j]==inf) continue; 20 vector <node>::iterator it; 21 for (it=map[j].begin();it!=map[j].end();it++) { 22 node e= *it; 23 if (e.w!=inf && dist[e.to]>dist[j]+e.w) { 24 dist[e.to]=dist[j]+e.w; 25 } 26 } 27 } 28 } 29 for (j=1;j<=n;j++) { 30 if (dist[j]==inf) continue; 31 vector <node>::iterator it; 32 for (it=map[j].begin();it!=map[j].end();it++) { 33 node e= *it; 34 if (e.w!=inf && dist[e.to]>dist[j]+e.w) { 35 return false; 36 } 37 } 38 } 39 return true; 40 } 41 42 int main() { 43 int k,i,j,w; 44 scanf("%d%d",&m,&n); 45 for (k=1;k<=m;k++) { 46 scanf("%d%d%d",&i,&j,&w); 47 node e; 48 e.to=j; 49 e.w=w; 50 map[i].push_back(e); 51 } 52 ford(1); 53 for (i=1;i<=n;i++) { 54 printf("%d\n",dist[i]); 55 } 56 return 0; 57 }
原文:http://www.cnblogs.com/wuyuema/p/7642704.html