資料結構筆記13 最短路徑

2021-10-01 05:12:31 字數 1266 閱讀 9914

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

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

dijkstra演算法

基本思想:

1、設定乙個集合s存放已經找到最短路徑的頂點,s的初始狀態只包含源點v,

2、對vi∈v-s,假設從源點v到vi的有向邊為最短路徑(從v到其餘頂點的最短路徑的初

值)。3、以後每求得一條最短路徑v, …, vk,就將vk加入集合s中,並將路徑v, …, vk , vi與

原來的假設相比較,取路徑長度較小者為最短路徑。

4、重複上述過程,直到集合v中全部頂點加入到集合s中。

路徑長度最短的最短路徑(即第一條最短路)的特點:

在這條路徑上,必定只含一條邊,並且這條邊上的權值最小。

下一條路徑長度次短的最短路徑的特點:

它只可能有兩種情況:

或者是直接從源點到該點(只含一條邊); 

或者是從源點經過頂點v1(第一條最短路徑所依附的頂點),再到達該頂點(由兩條

邊組成)。

再下一條路徑長度次短的最短路徑的特點:

它可能有四種情況:或者是直接從源點到該點(只含一條邊); 或者從源點經過頂點

v1,再到達該頂點(由兩條邊組成);或者是從源點經過頂點v2,再到達該頂點(兩

條條邊);或者是從源點經過頂點v1、v2,再到達該頂點(多條邊)。

其餘最短路徑的特點:

它或者是直接從源點到該點(只含一條邊); 或者是從源點經過已求得最短路徑的

頂點(集合s中的頂點),再到達該頂點。

資料結構 :

圖的儲存結構:鄰接矩陣儲存結構

陣列dist[n]:每個分量dist[i]表示當前所找到的從始點v到終點vi的最短路徑的長

度。初態為:

若從v到vi有弧,則dist[i]為弧上權值;否則置dist[i]為∞。

陣列path[n]:path[i]是乙個字串,表示當前所找到的從始點v到終點vi的最短路

徑。初態為:若從v到vi有弧,則path[i]為vvi;否則置path[i]空串。

陣列s[n]:存放源點和已經找到最短路徑的終點,其初態為只有乙個源點v。 

const int max=1000;

void  dijkstra(mgraph g, int v)

0≤k≤n-1

陣列path[n][n]:

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

void floyd(mgraph g)

{for (i=0; i

資料結構 最短路徑 Dijkstra

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

資料結構實驗 最短路徑

實驗內容 對於使用者隨機輸入的乙個有向帶權圖,求從某個頂點到其他各頂點的最短路徑。include define maxv 20 define inf 32 若不存在,則設的權為32,表示無窮大 typedef struct vertextype 頂點型別 typedef struct matgrap...

資料結構 最短路徑問題

求解這個問題的時候我們用到dijkstra演算法,演算法的描述如下 1 首先定義乙個陣列用來儲存從源點到每乙個頂點的最短路徑 不可達用無窮表示 使用s集合來儲存已經求得最短路徑的頂點,那麼剩餘頂點就存放在集合t中 2 第一次迭代的時候s只有源點,然後根據s集合中的頂點來更新最短路徑陣列d中的值,每次...