最短路徑Dijkstra演算法

2022-04-28 07:25:27 字數 2509 閱讀 3106

最短路徑問題:

從圖的乙個頂點出發,到達圖的另乙個頂點的最短路徑

解法:

迪傑斯特拉演算法(dijkstra演算法)

弗洛伊德演算法(floyd演算法)

spfa演算法

dijkstra演算法介紹

主要是通過廣度優先遍歷,對每個點進行鬆弛操作找到源點到其他每個點的最短路徑

具體實現流程:

一、初始化圖

1、首先定義圖的結構體包含鄰接陣列和頂點陣列

2、然後輸入每乙個頂點的值,然後按輸入頂點順序來輸入鄰接陣列的每個值

3、為了方便自己到自己可以設定為0,沒有路徑設定為-1,有路徑設定路徑值

4、對鄰接陣列進行加工,把距離為-1的設定為預設的無窮大

二、通過dijkstra求最短路徑

思想:通過乙個距離陣列不斷鬆弛求最短路徑,鬆弛過程中記錄通過的點

第一次將源點的資料記錄到距離陣列並將源點標記,然後依次找最近的未標記的點進行鬆弛操作,所有的點標記後得到的陣列就是到其他每個點的最短距離,可以通過前驅節點來找到對應的路徑。

鬆弛操作:比如1 2 3 4四個頂點求1到4的最短路徑,首先加入1,通過鄰接矩陣得到1到其他每個點的最短路徑,然後加入離1最近的點(比如3),鬆弛 其他距離(判斷1到2的直接距離小還是通過3到2 的間接距離小)(判斷1到4的直接距離小還是通過3到4的間接距離小),依次對其他每個未標記的點進行判斷取最小

5、首先定義需要的陣列,包含used判斷每個頂點是否已經被標記

6、通過距離陣列記錄源點到其他點的距離

7、前驅節點陣列用來記錄當前節點離源點最近的路徑的上乙個點,用來尋找最短路徑

8、初始化陣列,標記陣列都設定為未標記,源點設定為已標記,距離陣列讀取鄰接矩陣中源點的行,前驅節點都設定為自己

9、從源點開始找最近的點一次進行鬆弛操作,找到最近且未標記的點,判斷到其他未標記的點是不是可以通過這個新加入的點所短路徑,如果可以縮短就修改距離和前驅階段,直到所有頂點都被標記

10、通過前驅節點陣列找到對應路徑,通過距離陣列得到最短值。

實現**:

#include #include 

#include

#define maxsize 20

#define infinity 666typedef

char

vertextype;

//定義圖 的鄰接矩陣表示法結構

typedef struct

graph graph;

//鄰接矩陣法圖的生成函式

void creategraph( graph *g )

//求圖的頂點數

intcalvernum( graph g )

//將不鄰接的頂點之間的權值設定為infinity

void setweight( graph *g )

}}//

dijkstra求最短路徑函式

void

dijkstra( graph g )

printf(

"\n\n");

printf(

"讀取到的鄰接矩陣為(666表示無窮大)\n");

for( i=0; i)

printf("\n

");}

printf("\n

");printf(

"請輸入起點和終點(空格隔開):");

char

a,b;

intst,en;

fflush(stdin);

scanf(

"%c %c

",&a,&b);

for( i=0; i)

if(g.ver[i] ==b)

}for( i=0; i)

used[st] = 1

;

for( i=0; i1; i++)

}used[j] = 1

;

for( n=0; n)

}}

char ans [20

];

int dq=st,dw=en;

int pathnum=0

; ans[pathnum++] =g.ver[dw];

while(g.ver[dw]!=g.ver[dq])

printf(

"\n路徑是:");

for( i=pathnum-1; i>=0; i--)

else

} printf(

"\n\n");

if(distance[en]==666

) else

}int

main()

檔案內容:

1234

0 1 -1 3

-1 0 2 4

-1 -1 0 5

-1 -1 -1 0

很經典,思想也很簡單

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