最短路演算法(3種演算法)

2021-10-23 01:15:57 字數 2169 閱讀 8215

最短路,顧名思義,最短的路徑。我們把邊帶有權值的圖稱為帶權圖。邊的權值可以理解為兩點之間的距離。一張圖中任意兩點之間會有不同的路徑相連。最短路徑就是指連線兩點的這些路徑中最短的一條。我們有四種演算法可以有效地解決最短路徑問題,但是當出現負邊權時,有些演算法不適用。

for

(int k =

1; k <= n; k++

)//列舉中間點(必須放最外層)

for(

int i =

1; i <= n; i++

)//列舉端點i

if(i != k)

for(

int j =

1; j <= n; j++

)//列舉端點j

if(i != j && j != k && dis[i]

[j]> dis[i]

[k]+ dis[k]

[j])

dis[i]

[j]= dis[i]

[k]+ dis[k]

[j];

完整**

1     #include 

2int

main()

319//floyd-warshall演算法核心語句

20for

(k=1

;k<=n;k++)21

for(i=

1;i<=n;i++)22

for(j=

1;j<=n;j++)23

if(e[i]

[j]>e[i]

[k]+e[k]

[j])

24 e[i]

[j]=e[i]

[k]+e[k]

[j];

25//輸出最終的結果

26for

(i=1

;i<=n;i++)27

32printf

("\n");

33}34return0;

35}

floyd-warshall演算法不能解決帶有「負權迴路」(或者叫「負權環」)的圖,因為帶有「負權迴路」的圖沒有最短路。

for

(int k =

1; k <= n; k++

)//列舉中間點

for(

int i =

1; i <= n; i++

)//列舉端點i

if(i != k)

for(

int j =

1; j <= n; j++

)//列舉端點j

if(i != j && j != k)

dis[i]

[j]= dis[i]

[j]||

(dis[i]

[k]&& dis[k]

[j])

;(判斷是否相連)

(偽**)

if(dis[u]

+ w[u]

[v]< dis[v]

)

#define inf 99999999

/***構建鄰接矩陣edge,且1為源點***/

for(i =

1; i <= n; i++

) dst[i]

= edge[1]

[s];

for(i =

1; i <= n; i++

) book[i]=0

;book[1]

=1;for

(i =

1; i <= n-

1; i++)}

book[u]=1

;//更新最短路徑陣列

for(k =

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

}

(偽**)

for(

int i =

1; i <= n -

1; i++

)for

(int j =

1; j <= e; j++

)//注意要列舉所有邊,不能列舉點

if(dis[u]

+ w[j]

< dis[v]

)//u, v分別是這條邊連線的兩個點

演算法 最短路演算法

最短路演算法用於求帶權有向圖中,兩點之間的最近距離。它通過不斷擴大已知的最短路徑,直到最短路徑覆蓋終點為止。由下面的程式可以看書,它的時間複雜度為o n 3 下面舉一簡單例子說明最短路演算法的步驟。想求v0到v7的最短路徑,初始的時候,只知道v0距離自己的最短距離為0.使用乙個close陣列儲存以求...

最短路演算法

常用的最短路演算法有三種 disjkstra,floyd,ballman floyd 一 disjkstra演算法 dijkstra演算法要求圖上的權非負數。同樣使用於無向圖 html view plain copy include stdio.h hdu 2544 define maxsum 0x...

最短路演算法

最短路演算法有很多,具體哪個好,和資料是有很大關係的 從起點開始向外擴充套件,最壞o v e 實際體驗比o e log v 的dijkstra可能快 include include define max e 4002 define max v 1002 define inf 0x3f3f3f usi...