最短路徑-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...