Floyd演算法求解最短距離

2021-10-06 09:32:12 字數 1474 閱讀 5954

用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽**和給出距離矩陣(頂點之間的最短距離矩陣)。

floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與dijkstra演算法類似。

如果要讓任意兩點之間的路程變短,只能引入第三個點(頂點k),並通過這個頂點k中轉即a->k->b,才可能縮短原來從頂點a點到頂點b的路程。有時候不只通過乙個點,而是經過兩個點或者更多點中轉會更短,即a->k1->k2->b。引入二維陣列來儲存。

起始時兩點間的距離矩陣:

1 2 3 4

1 0 2 6 4

2 ╲ 0 3 ╲

3 7 ╲ 0 1

4 5 ╲ 12 0

經過1號點後兩點的距離矩陣:

1 2 3 4

1 0 2 5 4

2 ╲ 0 3 ╲

3 7 9 0 1

4 5 7 12 0

經過1.2號點後兩點的距離矩陣:

1 2 3 4

1 0 2 6 4

2 ╲ 0 3 ╲

3 7 ╲ 0 1

4 5 ╲ 12 0

經過1.2.3號點後兩點的距離矩陣:

1 2 3 4

1 0 2 5 4

2 10 0 3 4

3 7 9 0 1

4 5 7 10 0

經過1.2.3.4號點後兩點的距離矩陣:

1 2 3 4

1 0 2 5 4

2 9 0 3 4

3 6 8 0 1

4 5 7 10 0

例如經過1號點:

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

}l演算法核心語句

int f = 0;

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

}最開始只允許經過1號頂點進行中轉,接下來只允許經過1和2號頂點進行中轉……允許經過1~4號所有頂點進行中轉,求任意兩點之間的最短路程,從i號頂點到j號頂點只經過前k號點的最短路程。

使用三次for迴圈,時間複雜度o(n^3).

#include

#define inf 999;

//infwei無窮值

intmain()

}//讀入邊

for(i=

1;i<=m;i++

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

int f =0;

for(k=

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

//輸出經過中間點的最終的結果

++f;

printf

("增加前%d個點時的矩陣:\n"

,f);

for(i=

1;i<=n;i++

)printf

("\n");

}printf

("\n");

}return0;

}

最短距離之Floyd演算法

用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離矩陣 頂點之間的最短距離矩陣 floyd演算法可以方便的求得任意兩點的最短路徑,這稱為多源最短路,演算法的核心思想是動態規劃。它將多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解。根據以往的經驗,如果要...

Floyd求最短距離

用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離 頂點之間的 最短距離矩陣 按實驗報告模板編寫演算法。floyd演算法的基本思想如下 從任意節點a到任意節點b的最短路徑不外乎2種可能,1是直接從a到b,2是從a經過若干個節點x到b。所以,我們假設dis ab 為節點...

最短距離及最短路(Floyd 演算法)

include include using namespace std define n 100 define max 1000000 int d n n int path n n void min d int h 該函式找出最短距離,及最短路徑 coutcoutint h,a,b,k cout 輸...