使用Floyd-Warshall显示无向图上的最小周期

时间:2016-07-01 04:27:09

标签: c++ c graph floyd-warshall floyd-cycle-finding

我遇到了一些问题。 首先,我使用Floyd-warshall在有向图上显示所有最小周期并且它起作用,但后来我尝试将它与无向图一起使用,它并不像我需要的那样工作。

例如,假设我有这张图:

INF     INF     19      14      8
INF     INF     13      INF     9
19      13      INF     INF     3
14      INF     INF     INF     10
8       9       3       10      INF

这应该是这样的:

Graph representation

无论如何,既然你可以将无向图表示为有向图(就像我在示例矩阵中所做的那样),Floyd Warshall应该可以工作,但结果并不是我所期望的。使用相同的图形示例,这是具有最小路径成本的矩阵:

最小路径费用:

16      17      11      14      8
17      18      12      19      9
11      12      6       13      3
14      19      13      20      10
8       9       3       10      6

这是带路径的矩阵:

 (0 4 0) (0 4 1) (0 4 2) (0 3)   (0 4)
 (1 4 0) (1 4 1) (1 4 2) (1 4 3) (1 4)
 (2 4 0) (2 4 1) (2 4 2) (2 4 3) (2 4)
 (3 0)   (3 4 1) (3 4 2) (3 4 3) (3 4)
 (4 0)   (4 1)   (4 2)   (4 3)   (4 2 4)

由于我只对循环感兴趣,我只需要矩阵的对角线。

无论如何,让我们采取0 - > 0:结果是(0 4 0),其成本是16

无论如何,因为我正在寻找最小周期,我期待的是:

0 - > 0,路径(0 4 2 0)(或0 2 4 0因为是无向图,但我只需要其中一个)并且花费30。

这实际上是floyd-warshall代码:

for (k = 0; k < V; k++)
{
    for (i = 0; i < V; i++)
    {
        for (j = 0; j < V; j++)
        {
            if (dist[i][k] != INF && dist[k][j] != INF &&
                dist[i][k] + dist[k][j] < dist[i][j]) {

                dist[j][i] = dist[i][j] = dist[i][k] + dist[k][j];
                path[i][j] = path[j][i] = path[k][j];
            }
        }
    }
}

我真的不知道我需要改变什么来获得正确的结果(或者这可能是正确的结果,我认为不是。)

0 个答案:

没有答案