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