【发布时间】:2015-12-05 20:35:04
【问题描述】:
我的代码似乎有问题。对于最短路径,我得到了一些意想不到的值。我将结果与仅使用正距离的 Dijkstra 和 Bellman 算法进行了比较,因此问题不在于输入。此外,我首先将无限距离输入为零,然后转换它们(对角线除外)。任何反馈将不胜感激。
#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;
}
【问题讨论】:
-
您确实意识到在您的算法中
infinity + something会给出一个负数?? -
Adj_Matrix[i][k] + Adj_Matrix[k][j]表现出未定义的行为,通过整数溢出,如果任一权重恰好是std::numeric_limits<int>::max()(在您的程序中也称为infinity)
标签: c++ algorithm graph directed-graph