Bellman-Ford算法优化

时间:2021-04-16 09:45:32

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;
}