使用 Floyd 算法找到最短路径
Find the shortest path with Floyd algorithm
我有一个包含数字 0 和 1 的邻接矩阵。如果从一个节点到另一个节点没有边,则该字段将为 0,否则该字段将标记为 1。
那么,如果邻接矩阵中有一个字段为0,则节点之间没有边,否则有一条权重为1的边。
现在,我已经应用 Floyd 算法找出从任何节点到其他节点的最短路径。但是我没有得到正确的解决方案。
这是我的 Floyd 算法实现。
void Floyd_Warshal(int graph[Nodes][Nodes], int D[Nodes][Nodes])
{
for (int i = 0; i < Nodes; i++)
{
for (int j = 0; j < Nodes; j++)
{
if (graph[i][j] == 0) { graph[i][j] = INT_MAX; }
D[i][j] = graph[i][j];
}
}
for (int k = 0; k < Nodes; k++) {
for (int i = 0; i < Nodes; i++)
{
for (int j = 0; j < Nodes; j++)
{
if (D[i][j] > D[i][k] + D[k][j]) {
D[i][j] = D[i][k] + D[k][j];
}
}
}
}
}
我已将 0 设置为 INT_MAX
以构建算法的标准矩阵,但我没有得到正确的解决方案。
此外,这是我的矩阵的示例:
A B C D
A 0 0 1 0
B 1 1 0 1
C 0 0 1 0
D 1 0 0 0
将矩阵应用到算法后,矩阵中的任意0都会被转换为INT_MAX
。我希望权重为 2 或 1,但我得到了意想不到的值,例如 -2712323...
你得到非常大的负值的原因是整数溢出。
如果没有边,你设置D[i][j]=INT_MAX
。但是后来
if (D[i][j] > D[i][k] + D[k][j]) {
D[i][j] = D[i][k] + D[k][j];
如果从i
到k
和从k
到j
都没有边,则和会溢出,结果为负。之后,你的算法会认为从这个 i
到这个 j
有一条很短的(大负数)路径,这会毒化所有其他路径。
如果 INT_MAX
.
,我建议你使用 INT_MAX/2
我有一个包含数字 0 和 1 的邻接矩阵。如果从一个节点到另一个节点没有边,则该字段将为 0,否则该字段将标记为 1。
那么,如果邻接矩阵中有一个字段为0,则节点之间没有边,否则有一条权重为1的边。
现在,我已经应用 Floyd 算法找出从任何节点到其他节点的最短路径。但是我没有得到正确的解决方案。
这是我的 Floyd 算法实现。
void Floyd_Warshal(int graph[Nodes][Nodes], int D[Nodes][Nodes])
{
for (int i = 0; i < Nodes; i++)
{
for (int j = 0; j < Nodes; j++)
{
if (graph[i][j] == 0) { graph[i][j] = INT_MAX; }
D[i][j] = graph[i][j];
}
}
for (int k = 0; k < Nodes; k++) {
for (int i = 0; i < Nodes; i++)
{
for (int j = 0; j < Nodes; j++)
{
if (D[i][j] > D[i][k] + D[k][j]) {
D[i][j] = D[i][k] + D[k][j];
}
}
}
}
}
我已将 0 设置为 INT_MAX
以构建算法的标准矩阵,但我没有得到正确的解决方案。
此外,这是我的矩阵的示例:
A B C D
A 0 0 1 0
B 1 1 0 1
C 0 0 1 0
D 1 0 0 0
将矩阵应用到算法后,矩阵中的任意0都会被转换为INT_MAX
。我希望权重为 2 或 1,但我得到了意想不到的值,例如 -2712323...
你得到非常大的负值的原因是整数溢出。
如果没有边,你设置D[i][j]=INT_MAX
。但是后来
if (D[i][j] > D[i][k] + D[k][j]) {
D[i][j] = D[i][k] + D[k][j];
如果从i
到k
和从k
到j
都没有边,则和会溢出,结果为负。之后,你的算法会认为从这个 i
到这个 j
有一条很短的(大负数)路径,这会毒化所有其他路径。
如果 INT_MAX
.
INT_MAX/2