Floyd的最短路径算法C ++

时间:2017-04-18 17:46:09

标签: c++ algorithm matrix shortest-path

我在C ++中为Floyd的算法实现了一个函数,用于正确工作的加权有向图,除了当我生成一个路径矩阵,在尝试到达目的地时给出下一个节点时,它将顶点放在目标之前而不是矩阵中源的下一个节点。距离矩阵(dist)正确输出,如果源和目的地之间最多有一个节点,那么整个路径矩阵是正确的。因此,如果从顶点i到j有长的最短路径,那么path [i] [j]应该等于连接到i的k值,而是连接到j的k值,而我无法找出原因。功能如下所示。

void floyd(const Graph<City>& g, double**& dist, int**& path)
{
    int n = g.size();
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            path[i][j]=0;
            if (i==j)
                dist[i][j]=0;
            else if (!g.isEdge(i, j))
                dist[i][j]=INFINITY;
            else
                dist[i][j]=g.retrieveEdge(i, j);
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            for (int k = 1; k <= n; k++)
            {
                if ((dist[i][k]!=INFINITY) && (dist[k][j]!=INFINITY) && k!=i && k!=j && i!=j)
                {
                    if ((dist[i][j]) > (dist[i][k]+dist[k][j]))
                    {
                        path[i][j]=k;
                        dist[i][j]=dist[i][k]+dist[k][j];
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  

因此,如果从顶点i到j有长的最短路径,那么path [i] [j]应该等于连接到i的k值,而是连接到j的k值,而我无法找出原因。

不幸的是两者都没有。您的实施中没有任何内容可以保证path[i][j]应该等于k之后的i值,并且您path[i][j]当前是k的观察值紧接在j之前的值也是不正确的。 (请再试几个样本来验证第二点。)

您的实现保证唯一的事情是顶点path[i][j] == k位于从顶点i到顶点j的最短路径中某处。< / p>

因此,您可以通过执行以下操作来递归检索路径:

get_path(i, j):
    k = path[i][j]
    get_path(i, k) + k + get_path(k, j)

澄清了there does exist a method,您可以path[i][j]存储i,使其成为setInterval(function() { //something juicy }, 2000); 之后的顶点。