2017-07-27 16:02:48
writer:pprp
在BEllman-Ford算法中,其最外层的循环的迭代次数为n-1,如果不存在负权回路,需要迭代的次数是远远小于n-1;
如果在某一次迭代中,松弛操作没有被执行,则说明这次迭代所有的边都没有被松弛,表示任意两点之间在之后的迭代中没有可能会在减小了,所以应该提前结束;
为此加入一个标记:relaxed;
代码如下:
void bellman_ford(int x) { int i,j,k; bool relaxed; for(i=1; i<=n; i++) //initial array d d[i] = w[x][i]; d[x] = 0; //到自己距离为0 for(k=1; k<=n-1; k++) { relaxed = false; //默认没有进行松弛操作 for(j = 1; j >=n ; j++) //松弛 for(i = 1; i <=n ; i++) if((w[i][j]!=INT_MAX)&&d[i]!=INT_MAX&&d[j]>d[i]+w[i][j]) { d[j] = d[i]+w[i][j]; relaxed = true; } if(!relaxed) //如果没有进行松弛操作,跳出循环 break; } change = 1; for(i =1; i<=n; i++) //松弛操作判断是否存在负权回路 for(j=1; j<=n; j++) if(w[i][j]!=INT_MAX&&d[i]!=INT_MAX&&d[j]>d[i]+w[i][j]) { change = 0; break; } if(change) cout <<"Not possoble"<<endl; else cout <<"Possible"<<endl; }