[英]Floyd-Warshall algorithm
我的代碼似乎有問題。 對於最短的路徑,我得到了一些意外的值。 我將結果與僅使用正距離的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;
}
我在當前代碼中看到的唯一問題是::
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
條件,例如:
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];
}
我相信,這將使其起作用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.