我在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];
}
}
}
}
}
}
答案 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);
之后的顶点。