多元最短路徑 Floyd Warshall演算法

2021-08-27 16:24:03 字數 892 閱讀 9221

就拿從1到3,可以直接1->3,也可以1->2->3,我們發現,通過乙個「中轉」的2,1->3路徑會變短。

可以在乙個路徑中插入另乙個頂點,這樣可能會比直接過去的路徑更短,假設每個頂點都經過頂點2中轉,可以有這樣的語句。

我們用二維陣列graph儲存圖

int i;

int j;

for(i=1;i<=n;++i)

}

中轉頂點可以是圖中的任意乙個頂點,所以將所有頂點做一次中轉頂點 即可以將用乙個迴圈變數來當作中轉點

int i;

int j;

int k;

for(k=1;k<=n;++k)}}

完整**如下:

#include const int inf=999999999;

int main(void)

graph[i][i]=0;

}for(int i=1;i<=m;++i)

/*********核心部分*********/

int i,j,k;

for(i=1;i<=n;++i)

for(j=1;j<=n;++j)

for(k=1;k<=n;++k)

return 0;

}

雖然用插乙個中轉點來引出這段**,但是最短路徑不一定全是只會有乙個中轉點。

舉個栗子:假設乙個最短路徑是1->3->5->7,上述演算法先找出從1到5的最短路徑是1->3->5,現在的graph[1][5]被更新成為了grap[1][3]+graph[3][5],接下來計算1->7的最短路徑時上述演算法算出的時1->5->7,這裡的1->5實際上是1->3->5。這樣說可能有點亂,希望的對理解這個演算法有點幫助。

Floyd演算法求解多元最短路徑問題

問題描述 對於多個目標地a,b,c 求解兩地之間的最短路徑問題,例如求解 a c的距離,常見的解有兩種,一種是直接由a c,另一種是經過某個中轉地再到達目的地,即a b c,其中中轉地可以是n個。floyd演算法解釋 floyd演算法的核心思想是將多地間的距離構建為乙個距離矩陣 即二維陣列 然後再通...

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...