首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中带负循环的Floyd-Warshall

C++中带负循环的Floyd-Warshall
EN

Stack Overflow用户
提问于 2013-05-15 05:09:33
回答 1查看 478关注 0票数 1

我正在使用Floyd-Warshalls算法进行图搜索,不知道如何改变它来防止负循环。

当我进入时:

代码语言:javascript
复制
From  Cost   To
0      -1     1
1      -2     0

我得到了成本矩阵:

代码语言:javascript
复制
   0   1
0 -3  -4
1 -5 -10

然后它开始循环,直到崩溃,因为它仍然增加了负边沿,进一步降低了成本。

代码语言:javascript
复制
void FloydWarshall(int ***distanceMatrix, int maxVertices)
{
int from, to, via;

for(from = 0; from < maxVertices; from++)
{
 for(to = 0; to < maxVertices; to++)
 {
      for(via = 0; via < maxVertices; via++)
       {
         //Fix the negative looping
         //EDIT FIX:
         if((*distanceMatrix)[via][via]<0)
         {fprintf(stderr, "Contains negative cycle!\n"); continue;}
         //END EDIT
         //Searches for the cheapest way from all-to-all nodes, if new path
         // is cheaper than the previous one, its updated in matrix
         (*distanceMatrix)[from][to] = min((*distanceMatrix)[from][to],
         ((*distanceMatrix)[from][via]+(*distanceMatrix)[via][to]));
       }
 }
}
}

其中min是:

代码语言:javascript
复制
int min(int a,int b)
{return (a<b)? a:b;}

而且我的distanceMatrix在任何免费的地方都有中转功能。

我遇到了更老的话题,修改后的算法是这样的:

代码语言:javascript
复制
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)    // Go through all possible sources and targets

    for(int k = 0; d[i][j] != -INF && k < n; k++)
        if( d[i][k] != INF && // Is there any path from i to k?
            d[k][j] != INF && // Is there any path from k to j?
            d[k][k] < 0)      // Is k part of a negative loop?

            d[i][j] = -INF;   // If all the above are true
                              // then the path from i to k is undefined

然而,即使我使用这个修复而不是我的函数,它仍然循环并进一步降低了成本。这个修复正确吗?如果没有,我应该如何重写它?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 05:21:20

来自wikipedia

因此,要使用弗洛伊德-沃肖尔算法检测负圈,可以检查路径矩阵的对角线,负数的存在表明图中至少包含一个负圈。2显然,在无向图中,负边创建了涉及其关联顶点的负圈(即闭合行走)。

所以,如果d[k][k]小于0,你应该直接退出,并说这是一个负循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16552916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档