• Bellman-Ford算法优化


    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;
    }
  • 相关阅读:
    vb移动窗体的代码
    vb得到一个进程的启动参数?
    UTF8方式读写文件的模块
    JavaScript中Window.event详解
    vb设置窗体不可移动
    一拖二
    实习第一天
    사랑해
    决定考研
    Eclipse快捷键
  • 原文地址:https://www.cnblogs.com/pprp/p/7245409.html
Copyright © 2020-2023  润新知