Floyd的算法(最短路径)问题 - C ++

时间:2014-04-11 01:05:44

标签: c++ algorithm floyd-warshall

基本上,我的任务是实现Floyd的算法来找到矩阵的最短路径。在我的例子中,一个值是arg,矩阵变为大小arg * arg。下一个值字符串按接收顺序应用于矩阵。最后,-1表示无穷大。

说实话,我不知道我的问题出在哪里。当经过测试时,第一对夫妇通过,但其余的都失败了。我只会发布前两个失败以及传球。我只是发布相关的代码段。

int arg, var, i, j;

cin >> arg;

int arr[arg][arg];

for (i = 0; i < arg; i++)
{
    for(j = 0; j < arg; j++)
    {
        cin >> var;
        arr[i][j] = var;
    }
}


for(int pivot = 0; pivot < arg; pivot++)
{
    for(i = 0; i < arg; i++)
    {
        for(j = 0; j < arg; j++)
        {
            if((arr[i][j] > (arr[i][pivot] + arr[pivot][j])) && ((arr[i][pivot] != -1) && arr[pivot][j] != -1))
            {
                arr[i][j] = (arr[i][pivot] + arr[pivot][j]);
                arr[j][i] = (arr[i][pivot] + arr[pivot][j]);
            }
        }
    }
}

以下是我收到的失败。其余部分变得越来越长,达到20 * 20矩阵,所以我不会让你失望:

floyd> 
 * * * Program successfully started and correct prompt received. 

floyd 2 0 14 14 0
0 14 14 0 
floyd>   PASS  : Input "floyd 2 0 14 14 0" produced output "0 14 14 0".  

floyd 3 0 85 85 85 0 26 85 26 0
0 85 85 85 0 26 85 26 0 
floyd>   PASS  : Input "floyd 3 0 85 85 85 0 26 85 26 0" produced output "0 85 85 85 0 26 85 26 0".  

floyd 3 0 34 7 34 0 -1 7 -1 0
0 34 7 34 0 -1 7 -1 0 
floyd>   FAIL  : Input "floyd 3 0 34 7 34 0 -1 7 -1 0" did not produce output "0 34 7 34 0 41 7 41 0".  

floyd 4 0 -1 27 98 -1 0 41 74 27 41 0 41 98 74 41 0
0 -1 27 68 -1 0 41 74 27 41 0 41 68 74 41 0 
floyd>   FAIL  : Input "floyd 4 0 -1 27 98 -1 0 41 74 27 41 0 41 98 74 41 0" did not produce output "0 68 27 68 68 0 41 74 27 41 0 41 68 74 41 0".

1 个答案:

答案 0 :(得分:0)

想象一下情况arr[i][j] == -1,显然(arr[i][j] > (arr[i][pivot] + arr[pivot][j])) && ((arr[i][pivot] != -1) && arr[pivot][j] != -1)失败,但如果arr[i][pivot]arr[pivot][j]不是-1

则不应该

由于您使用的是-1而不是无穷大,所以您必须拥有类似if ((arr[i][j] == -1 || arr[i][j] > (arr[i][pivot] + arr[pivot][j])) && ((arr[i][pivot] != -1) && arr[pivot][j] != -1))的内容,即您要检查两件事:第一件是您的情况,第二件是{{1}时的情况1}}是无穷大,通过arr[i][j]的路径存在,因为在这种情况下,任何有效路径都小于无穷大。