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

2021-09-10 17:23:34 字數 1644 閱讀 3785

背景:在圖的學習過程中,最短路徑問題是乙個肯定會遇到的問題。而這個問題的原型**於我們實際生活中的問題,例如汽車的最優路徑導航。所以為了找到解決這些實際問題的最優方案,前輩們提出了dijkstra演算法和floyd演算法,下面就來詳細地了解一下這兩個出名的演算法。

現在,假設有v0~v6七個地方,每兩個地方之間的距離入下圖所示:

這是一種貪心演算法,每次找到一條權值最小的點加入到乙個集合中,該集合中的所有點已經找到源點到該點的最短距離長。主要步驟如下:

建立乙個資料結構vex,包含元素weight:記錄源點到該點的暫時的最短路徑長,visited:用於判斷該點是否已經在集合中,path:用於記錄源點到該點的最短路徑。然後用乙個vex陣列dis來尋找源點到各點的最短路徑長。

從dis陣列中每次取出乙個沒有被訪問過的,且暫時最短路徑長最小的點,將該點加入到集合中。此時,dis陣列中可能有些元素需要更新。將dis陣列更新。

上面的說起來有點籠統,大家可能不是很理解,接下來我們用上面的圖這個例項來理解dijkstra演算法。

假設源點為v0,預設v0點已經在集合中,則此時v0到v1之間距離為6,所以dis[1].weight = 6,v0到v2之間不是直接相連,故dis[2].weight = max,表示v0到v2不可達,以此類推,dis[3].weight = 9,dis[4].weight = max,dis[5].weight = max,dis[6].weight = max。

從不在集合中的點中,選出乙個距離最短的點,為v1,將dis[1].visited設定為true。之後再更新一下dis陣列,因為v1點加入到了集合中,所以v0可以通過v1到達v2,所以此時dis[2].weight = 11,其他點不需更新。

之後再從剩下的點中選出乙個距離最短的點,為v3,將dis[3].visited設定為true。之後再更新一下dis陣列,因為v3點加入到了集合中,所以v0可以通過v3到達v4,所以此時dis[4].weight = 16,v0可以通過v3到達v5,所以此時dis[5].weight = 19,其他點不需更新。

之後再重複以上的步驟,直至所有的點都加入到集合中。

struct vex;

/** * dijkstra**實現

* @param graph 圖的矩陣表示,例如graph[0][1]表示頂點0到頂點1的權值

* @param n 頂點個數

* @param start 起始頂點

*/void dijkstra(int graph[7], int n, int start)

dis[start].visited = true;

//每次尋找乙個新的頂點的最短路徑

for (int j = 1; j < n; ++j)

}dis[index].visited = true;

//更新dis陣列

for (int k = 0; k < n; ++k) }}

}for (int l = 0; l < n; ++l) }}

}for (int l = 0; l < 7; ++l) {

cout<

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...