最短路徑 Dijkstra演算法與Floyd演算法

2021-09-13 13:46:33 字數 4025 閱讀 4818

最短路徑-dijkstra演算法與floyd演算法

原文:一、最短路徑

①在非網圖中,最短路徑是指兩頂點之間經歷的邊數最少的路徑。

②在網圖中,最短路徑是指兩頂點之間經歷的邊上權值之和最短的路徑。 

③單源點最短路徑問題

問題描述:給定帶權有向圖g=(v, e)和源點v∈v,求從v到g中其餘各頂點的最短路徑。

應用例項——計算機網路傳輸的問題:怎樣找到一種最經濟的方式,從一台計算機向網上所有其它計算機傳送一條訊息。

④每一對頂點之間的最短路徑

問題描述:給定帶權有向圖g=(v, e),對任意頂點vi,vj∈v(i≠j),求頂點vi到頂點vj的最短路徑。

解決辦法1:每次以乙個頂點為源點,呼叫dijkstra演算法n次。顯然,時間複雜度為o(n3)。 解決辦法2:弗洛伊德提出的求每一對頂點之間的最短路徑演算法——floyd演算法,其時間複雜度也是o(n3),但形式上要簡單些。

二、dijkstra演算法

①基本思想:設定乙個集合s存放已經找到最短路徑的頂點,s的初始狀態只包含源點v,對vi∈v-s,假設從源點v到vi的有向邊為最短路徑。以後每求得一條最短路徑v, …, vk,就將vk加入集合s中,並將路徑v, …, vk , vi與原來的假設相比較,取路徑長度較小者為最短路徑。重複上述過程,直到集合v中全部頂點加入到集合s中。

②設計資料結構 :

1、圖的儲存結構:帶權的鄰接矩陣儲存結構 。

2、陣列dist[n]:每個分量dist[i]表示當前所找到的從始點v到終點vi的最短路徑的長度。初態為:若從v到vi有弧,則dist[i]為弧上權值;否則置dist[i]為∞。

3、陣列path[n]:path[i]是乙個字串,表示當前所找到的從始點v到終點vi的最短路徑。初態為:若從v到vi有弧,則path[i]為vvi;否則置path[i]空串。

4、陣列s[n]:存放源點和已經生成的終點,其初態為只有乙個源點v。

③dijkstra演算法——偽**

1 1. 初始化陣列dist、path和s;

2 2. while (s中的元素個數④c++**實現

1 #include2 #include3 #include4 using namespace std;

5 #define maxsize 10

6 #define maxcost 10000

7 // 圖的結構

8 template9 struct graph

10 ;

15 // 最短路徑dijkstra演算法

16 void dijkstra(graphg,int v)

17 32 s[0] = v; // 初始化s

33 final[v] = true;

34 int num = 1;

35 while (num < g.vertexnum)

36

47 }

48 cout << dist[k]

55

59 }

60 }

61 }

62 int main()

63 ;

67 /*int length = sizeof(temp) / sizeof(temp[0]);

68 g.vertexnum = length;

69 g.arcnum = 7;*/

70 ifstream in("input.txt");

71 in >> g.vertexnum >> g.arcnum;

72 // 初始化圖的頂點資訊

73 for (int i = 0; i < g.vertexnum; i++)

74

77 //初始化圖g的邊權值

78 for (int i =0; i > m >> n >> cost;

89 g.arc[m][n] = cost;

90 }

91 dijkstra(g, 0);

92 system("pause");

93 return 0;

94 }

// input.txt

1 5 7

2 0 1 10

3 0 3 30

4 0 4 100

5 1 2 50

6 2 4 10

7 3 2 20

8 3 4 60

三、floyd演算法①基本思想:對於從vi到vj的弧,進行n次試探:首先考慮路徑vi,v0,vj是否存在,如果存在,則比較vi,vj和vi,v0,vj的路徑長度,取較短者為從vi到vj的中間頂點的序號不大於0的最短路徑。在路徑上再增加乙個頂點v1,依此類推,在經過n次比較後,最後求得的必是從頂點vi到頂點vj的最短路徑。

②設計資料結構

1、圖的儲存結構:帶權的鄰接矩陣儲存結構  。

2、陣列dist[n][n]:存放在迭代過程中求得的最短路徑長度。迭代公式:

3、陣列path[n][n]:存放從vi到vj的最短路徑,初始為path[i][j]="vivj"。

③c++**實現

1 #include2 #include3 #include4 using  namespace std;

5 #define maxsize 10

6 #define maxcost 10000

7 int dist[maxsize][maxsize];// 存放在迭代過程中求得的最短路徑

8 string path[maxsize][maxsize];// vi到vj的最短路徑

9 // 圖的結構

10 template11 struct graph

12 ;

17 void floyd(graphg)

18 ;

47 // 初始化圖的頂點資訊

48 for (int i = 0; i < g.vertexnum; i++)

49

52 //初始化圖g

53 for (i = 0; i < g.vertexnum; i++)

54

59 }

60 //構建圖g

61 for (int k = 0; k > i >> j >> cost;

64 g.arc[i][j] = cost;

65 }

66 floyd(g);

67 for (i = 0; i < g.vertexnum; i++)

68

76 }

77 }

78 system("pause");

79 return 0;

80 }

// input.txt

3 50 1 4

1 0 6

0 2 11

2 0 3

1 2 2

Dijkstra最短路徑演算法

基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...

Dijkstra最短路徑演算法

引入 dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。package dijkstra p...

最短路徑 Dijkstra演算法

最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...