首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Floyd-Warshall算法

Floyd-Warshall算法
EN

Stack Overflow用户
提问于 2015-12-05 20:35:04
回答 1查看 3.7K关注 0票数 0

我的代码好像有问题。我得到了一些关于最短路径的意外值。我把结果与Dijkstra算法和Bellman算法进行了比较,只使用正距离,所以问题不是输入问题。另外,我首先将无限距离输入为零,然后转换它们(对角距离除外)。如有任何反馈,将不胜感激。

代码语言:javascript
复制
#include <iostream>
#include <limits>
#define infinity std::numeric_limits<int>::max()



void Warshall(int **Adj_Matrix, int vertices){

int i,j,k;

for(k = 0; k < vertices; k++)
    for(i = 0; i < vertices; i++)
        for(j = 0; j < vertices; j++)
            if(Adj_Matrix[i][j] > (Adj_Matrix[i][k] + Adj_Matrix[k][j]))
                   Adj_Matrix[i][j] = Adj_Matrix[i][k]+Adj_Matrix[k][j];       
}

int main(){


int i,j,NumofVertices;
int **Adj_Matrix;
int *Cost_Row;

std::cout<<"Enter the number of vertices: ";
std::cin>>NumofVertices;

Adj_Matrix = new int*[NumofVertices];

for(i = 0;i < NumofVertices; i++){
    Adj_Matrix[i] = new int[NumofVertices];
}

std::cout<<"Enter the adjacency matrix"<<std::endl;
    for(i = 0; i < NumofVertices; i++){
        for(j = 0; j < NumofVertices; j++){
            std::cin>> Adj_Matrix[i][j];
            if (Adj_Matrix[i][j] == 0 && i != j)
            {
                Adj_Matrix[i][j] = infinity;
            }
    }
}

Warshall(Adj_Matrix,NumofVertices);
for(i = 0; i < NumofVertices; i++){
    for(j = 0; j < NumofVertices; j++){
            std::cout<<"Shortest path between "<<i<<" and "<<j<<" is : ";
            if(Adj_Matrix[i][j]==infinity)
                    std::cout<<"INF"<<std::endl;
            else
                    std::cout<<Adj_Matrix[i][j]<<std::endl;
    }
}

return 0;

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-05 20:48:36

我看到的当前代码的唯一问题是:

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

因此,万一Adj_Matrix[i][k]Adj_Matrix[k][j]是无穷大的,那么如果尝试向其添加某些内容,那么它就是一个整数溢出,并且该值将是未定义的(大部分为负值!)这将导致修改Adj_Matrix[i][j]的值!

为了防止这种情况,只需添加一个if条件,如下所示:

代码语言:javascript
复制
for(k = 0; k < vertices; k++)
    for(i = 0; i < vertices; i++)
        for(j = 0; j < vertices; j++)
            if(Adj_Matrix[i][k] != infinty && Adj_Matrix[j][k] != infinity && Adj_Matrix[i][j] > (Adj_Matrix[i][k] + Adj_Matrix[k][j]))
                   Adj_Matrix[i][j] = Adj_Matrix[i][k]+Adj_Matrix[k][j];       
}

我相信这会让它发挥作用的!

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

https://stackoverflow.com/questions/34110552

复制
相关文章

相似问题

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