gpt4 book ai didi

java - 负循环的 Floyd-Warshall。我如何找到所有未定义的路径?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:47 26 4
gpt4 key购买 nike

我已经实现了 Floyd Warshall 算法并且它有效,但问题是我不知道如何找到所有未定义的路径。我在网上搜索过,但只能找到有关如何检测图形是否具有负循环的答案。

vector< vector <int> > floyd_warshall(vector< vector<int> > d, int n){
for(int i = 0; i < n; i++) d[i][i] = 0;

for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < n; k++){
if(d[j][i] + d[i][k] < d[j][k] and d[j][i] != INF and d[i][k] != INF){
d[j][k] = d[j][i] + d[i][k];
}
}
}
}

return d;
}

在图上运行算法后:

from: to:   weight:
0 1 1
1 2 -1
2 1 -1
1 3 1
4 0 1

我得到邻接矩阵:

  | 0     1     2     3     4
--|----------------------------
0 | 0 -1 -2 -2 INF
1 | INF -2 -3 -3 INF
2 | INF -3 -4 -4 INF
3 | INF INF INF 0 INF
4 | 1 -2 -3 -7 0

我知道如果节点 i 是负循环的一部分,它在矩阵中的位置 d[i][i] 处有一个负值。因此,如果我检查矩阵的对角线,我可以找到属于负循环的所有节点。因此,如果我们查看上面的示例,我们可以看到节点 1 和 2 是负循环的一部分。问题是我想找到哪些路径已定义,哪些路径未定义。如果你可以通过一个负循环从 A 到 B,那么路径的长度应该是不确定的,因为它可以是任意小的。

所以问题是,我怎样才能找到所有未定义的路径?

我希望算法返回矩阵:(而不是上面那个)

  | 0     1     2     3     4
--|----------------------------
0 | 0 -INF -INF -INF INF
1 | INF -INF -INF -INF INF
2 | INF -INF -INF -INF INF
3 | INF INF INF 0 INF
4 | 1 -INF -INF -INF 0

其中 d[i][j] = INF 表示 i 和 j 之间没有路径,-INF 表示 i 和 j 之间存在任意小路径(该路径在某处经过负循环),否则为d[i][j] i 和 j 之间的最短长度。

我正在考虑测试每条路径,但这可能太慢了。一定有一些标准的方法来解决这个问题,对吧?

谢谢

最佳答案

好吧,我找到了解决我自己问题的方法。

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

我认为它应该有效,而且似乎也有效。

关于java - 负循环的 Floyd-Warshall。我如何找到所有未定义的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15709277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com