c++ - Floyd-Warshall STP 实现

标签 c++

我对 Floyd-Warshall 算法有疑问。如果输入有超过 4 个顶点,它就不起作用。为了制作二维动态数组,我制作了一个动态数组 [N*N] 并访问 A[i,j] = A[(i-1)*N+j]

void floyd_Algorithm(fstream &F2,int N,int matrixGraph[],int matrixP[])
{
for (int k=1; k<=N; k++)
    for (int i=1; i<=N; i++)
        for (int j=1; j<=N; j++)
        {
            if (matrixGraph[(i-1)*N+j] > matrixGraph[(i-1)*N+k] + matrixGraph[(k-1)*N+j])
            {
                matrixGraph[(i-1)*N+j] =  matrixGraph[(i-1)*N+k] + matrixGraph[(k-1)*N+j];
                matrixP[(i-1)*N+j] = k ;
            }
}

这里是4个顶点矩阵的输入

4

0 10 6 2| 10 0 5 3 | 6 5 0 1| 2 3 1 0|

输出

0 5 3 2
5 0 4 3
3 4 0 1
2 3 1 0

1 4 4 1
4 2 4 2
4 4 3 3
4 4 4 4

7个顶点矩阵输入

7

0 3 6 0 0 0 0| 3 0 2 4 0 0 0| 6 2 0 1 4 2 0 | 0 4 1 0 2 0 4| 0 0 4 2 0 2 1| 0 0 2 0 2 0 1| 0 0 0 4 1 1 0|

输出

0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

1 5 7 1 1 1 1
5 2 7 5 2 2 2
7 7 3 7 7 7 3
4 5 7 4 1 4 1
5 5 7 1 5 1 1
6 6 7 6 1 6 1
7 7 7 1 1 1 7

最佳答案

你的索引有问题。

如果你的顶点在 1 <= v <= N 的范围内,那么 i 和 j 之间的路径应该是矩阵[(i-1)*N+j-1]

为避免错误,您可能应该将顶点保持在 0 <= v < N 的范围内,因为 (int i = 0; i < N; i++), matrix[i*N+j]

关于c++ - Floyd-Warshall STP 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294023/

相关文章:

c++ - 如何防止新碰撞绕过旧碰撞? (2D)

c++ - 用自定义删除器封装 C 类型指针的常用方法

c++ - 将指向未知实例(但已知类)的已知成员的指针转换为拥有实例

c++ - 插入 vector

c++ - C/C++ : uint8_t bitfields behave incorrectly and inconsistently

c++ - 在类和类的标题中重载 << 运算符时遇到问题

c++ - 在函数调用时从异构初始化列表构建元组

C++ 模板 t 不是有效的模板类型

c++ - 这个三元条件表达式是如何执行的?

c++ - "Variable"变量名 C++