Floyd-Warshall不能发现什么是错的

时间:2014-05-28 17:51:52

标签: c# algorithm floyd-warshall

我需要一组新的眼睛,由于某些原因它没有生成正确的序列和距离矩阵,以下是我的实现。

这是在C#中,DistanceMatrix是双[,],而SequenceMatrix是一个字符串[,]

这些内容如下:http://puu.sh/951Tz/5ef27e3996.png

for (int k = 0; k < villageCount; k++)
        {
            for (int i = 0; i < villageCount; i++)
            {
                if (k == i)
                    continue;

                for (int j = 0; j < villageCount; j++)
                {
                    if (j == i)
                        continue;

                    if (j == k)
                        continue;

                    if (fw.DistanceMatrix[i, j] >= (fw.DistanceMatrix[i, k] + fw.DistanceMatrix[k, j]))
                    {
                        fw.DistanceMatrix[i, j] = (fw.DistanceMatrix[i, k] + fw.DistanceMatrix[k, j]);
                        fw.SequenceMatrix[i, j] = fw.SequenceMatrix[k, j];
                    }
                }
            }
        }

出于某种原因,我得到以下输出:

    [0, 0]  "A" string
    [0, 1]  "B" string
    [0, 2]  "A" string
    [0, 3]  "B" string
    [0, 4]  "D" string
    [1, 0]  "B" string
    [1, 1]  "D" string
    [1, 2]  "D" string
    [1, 3]  "B" string
    [1, 4]  "D" string
    [2, 0]  "B" string
    [2, 1]  "B" string
    [2, 2]  "B" string
    [2, 3]  "B" string
    [2, 4]  "D" string
    [3, 0]  "B" string
    [3, 1]  "B" string
    [3, 2]  "C" string
    [3, 3]  "C" string
    [3, 4]  "D" string
    [4, 0]  "B" string
    [4, 1]  "E" string
    [4, 2]  "D" string
    [4, 3]  "B" string
    [4, 4]  "E" string

任何指针都会非常感激,如果您需要更多信息,我将会访问此页面:)

init之后的距离矩阵

    [0, 0]  0.0                                 double
    [0, 1]  50.0                                    double
    [0, 2]  2.0                                 double
    [0, 3]  10.0                                    double
    [0, 4]  1.7976931348623157E+308 double
    [1, 0]  50.0                                    double
    [1, 1]  0.0                                 double
    [1, 2]  3.0                                 double
    [1, 3]  1.7976931348623157E+308 double
    [1, 4]  1.0                                 double
    [2, 0]  2.0                                 double
    [2, 1]  3.0                                 double
    [2, 2]  0.0                                 double
    [2, 3]  5.0                                 double
    [2, 4]  5.0                                 double
    [3, 0]  10.0                                    double
    [3, 1]  1.7976931348623157E+308 double
    [3, 2]  5.0                                 double
    [3, 3]  0.0                                 double
    [3, 4]  1.7976931348623157E+308 double
    [4, 0]  1.7976931348623157E+308 double
    [4, 1]  1.0                                 double
    [4, 2]  5.0                                 double
    [4, 3]  1.7976931348623157E+308 double
    [4, 4]  0.0                                 double

3 个答案:

答案 0 :(得分:2)

我相信我发现了问题。

您正在错误地初始化SequenceMatrix。你当前有

fw.SequenceMatrix[i, j] = map.Villages.ElementAt(i).Name;

但是,根据维基百科的文章,它应该是

fw.SequenceMatrix[i, j] = map.Villages.ElementAt(**j**).Name;

由于序列矩阵显示了要采用的路径,因此其中的值应为目的地,而不是起点。

看起来您的算法也存在错误。

fw.SequenceMatrix[i, j] = fw.SequenceMatrix[k, j];

但它应该是

fw.SequenceMatrix[i, j] = fw.SequenceMatrix[**i, k**];

由于您已确定从i移动到k到j比从i移动到j更短,因此您希望将新路径的第一步从i设置为j,使其与路径的第一步相同从我到k。

答案 1 :(得分:1)

问题可能是inf + inf没有问题(溢出)? 无论如何,我认为实现应该看起来像this

// d[i][j] == weight of edge (i,j)
// d[i][j] == INF if there is no such edge
// d[i][i] == 0; i = 0, .., n-1

for (int k = 0; k < n; ++k)
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            if (d[i][k] < INF && d[k][j] < INF) // i->k, k->j should exist
                d[i][j] = min (d[i][j], d[i][k] + d[k][j]); // INF+INF won't happen

答案 2 :(得分:0)

修复!!! HURRAY

与...一起没有问题!未保存的节点

数据库中的B C D,而不是A D B C,然后在读取i时在索引上进行处理,假设A在索引0处,B在索引1处,等等......

抱歉浪费时间,非常感谢!!!为了你的帮助!!