簡體   English   中英

Floyd-Warshall算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM