首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的Floyd-Warshall C++实现中的错误

我的Floyd-Warshall C++实现中的错误
EN

Stack Overflow用户
提问于 2010-06-12 10:13:07
回答 3查看 1.5K关注 0票数 3

我有一个我的大学的作业,已经成功地实现了Dijkstra和Bellman-Ford,但这一次我遇到了麻烦。一切看起来都很好,但它没有给我正确的答案。

代码如下:

代码语言:javascript
复制
void FloydWarshall()
{
    //Also assume that n is the number of vertices and edgeCost(i,i) = 0

    int path[500][500];

    /* A 2-dimensional matrix. At each step in the algorithm, path[i][j] is the shortest path
       from i to j using intermediate vertices (1..k−1).  Each path[i][j] is initialized to
       edgeCost(i,j) or infinity if there is no edge between i and j.
    */

    for(int i = 0 ; i <= nvertices ; i++)
        for(int j = 0 ; j <= nvertices ; j++)
            path[i][j] = INFINITY;

    for(int j = 0 ; j < narestas ; j++) //narestas = number of edges
    {
        path[arestas[j]->v1][arestas[j]->v2] = arestas[j]->peso; //peso = weight of the edge (aresta = edge)
        path[arestas[j]->v2][arestas[j]->v1] = arestas[j]->peso;
    }

    for(int i = 0 ; i <= nvertices ; i++) //path(i, i) = 0
        path[i][i] = 0;

    //test print, it's working fine
    //printf("\n\n\nResultado FloydWarshall:\n");
    //for(int i = 1 ; i <= nvertices ; i++)
    //    printf("distancia ao vertice %d:  %d\n", i, path[1][i]);


    // Here's the problem, it messes up, and even a edge who costs 4, and the minimum is 4, it prints 2.

    //for k = 1 to n
    for(int k = 1 ; k <= nvertices ; k++)
       //for i = 1 to n
       for(int i = 1 ; i <= nvertices ; i++)
           //for j := 1 to n
           for(int j = 1 ; j <= nvertices ; j++)
               if(path[i][j] > path[i][k] + path[k][j])
                   path[i][j] = path[i][k] + path[k][j];


    printf("\n\n\nResultado FloydWarshall:\n");
    for(int i = 1 ; i <= nvertices ; i++)
        printf("distancia ao vertice %d:  %d\n", i, path[1][i]);
}

我正在使用我制作的这个图表示例:

代码语言:javascript
复制
6 7

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

意味着我们有6个顶点(1到6)和7条边(1,2),权重为4...等等。

如果有人需要更多信息,我很乐意提供,只是厌倦了看这段代码却找不到错误。

EN

回答 3

Stack Overflow用户

发布于 2010-06-12 10:33:09

不要紧,我休息了一下,吃了点东西,发现了错误。

无穷大被定义为INT_MAX,所以一旦你向它添加了一些东西,它就会变成负数。

我只定义了一些大的东西(对于我的问题,像over9000,没有比这更多的图路径),它工作得很好。

但我能知道你为什么建议那样做吗?我没听懂。

谢谢

票数 2
EN

Stack Overflow用户

发布于 2010-06-12 10:22:54

代码语言:javascript
复制
 if(path[i][j] > path[i][k] + path[k][j])
  path[i][j] = path[i][k] + path[k][j];

在这里做一些检查。例如,如果pathi和pathk不是无限的,并且i!=j,i!=k,k!=j。

票数 0
EN

Stack Overflow用户

发布于 2010-06-12 10:39:30

另外,你的路径迭代的开始和结束不是在几个地方相差了一个吗?您可能希望它们从0运行到nvertices-1;即for (int i = 0; i < nvertices; i++)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3027216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档