Dijkstra演算法(求單源最短路徑)

2022-09-03 16:51:11 字數 1483 閱讀 8006

dijkstra演算法//原鏈結

1.定義概覽

dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。注意該演算法要求圖中不存在負權邊。

問題描述:在無向圖 g=(v,e) 中,假設每條邊 e[i] 的長度為 w[i],找到由頂點 v0 到其餘各點的最短路徑。(單源最短路徑)

2.演算法描述

1)演算法思想:設g=(v,e)是乙個帶權有向圖,把圖中頂點集合v分成兩組,第一組為已求出最短路徑的頂點集合(用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 , 就將加入到集合s中,直到全部頂點都加入到s中,演算法就結束了),第二組為其餘未確定最短路徑的頂點集合(用u表示),按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度。此外,每個頂點對應乙個距離,s中的頂點的距離就是從v到此頂點的最短路徑長度,u中的頂點的距離,是從v到此頂點只包括s中的頂點為中間頂點的當前最短路徑長度。

2)演算法步驟:

a.初始時,s只包含源點,即s=,v的距離為0。u包含除v外的其他頂點,即:u=,若v與u中頂點u有邊,則正常有權值,若u不是v的出邊鄰接點,則權值為∞。

b.從u中選取乙個距離v最小的頂點k,把k,加入s中(該選定的距離就是v到k的最短路徑長度)。

c.以k為新考慮的中間點,修改u中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。

d.重複步驟b和c直到所有頂點都包含在s中。

執行動畫過程如下圖

**如下:

//演算法目的:求出每個點到初始點的最小距離。  

//演算法步驟:以1為初始點,不斷跟新鄰接點到1的距離,選取最近鄰接點,重複跟新

#include#include#define inf 0x3f3f3f

int map[105][105],vis[105],dis[105],n;

void dijkstra(int x)

{ int min,i,j;

memset(vis,0,sizeof(vis)); //vis陣列表示某個點是否被訪問過,訪問過為1,未訪問為0

memset(dis,inf,sizeof(dis));//dis表示每個點到起點的最小距離,初值設為inf方便求最小值

dis[1]=0;// 1到1的距離為0

vis[1]=1;// 從1開始,1被訪問

for(i=0;i

Dijkstra演算法求單源最短路徑

與prim演算法樸素版實現起來差不多。樸素版dijkstra演算法 輸入乙個圖的矩陣,假定兩點不相鄰則權值為0 輸出每個頂點的最短路徑長度,可以列印指定頂點的路徑 dijkstra演算法跟prim演算法很像 相同的地方是 兩者都有乙個已經求得 mst 和已經求得 最短路 的集合 每納入乙個結點x到集...

Dijkstra演算法求單源最短路徑

dijkstra演算法求單源最短路徑 include include define vexsize 100 建立鄰接矩陣 int creat int cost vexsize return vexnum dijkstra演算法 void dijkstra int cost vexsize int v...

Dijkstra演算法求單源最短路徑

1.綜述 dijkstra演算法解決的是帶權重的有向圖上單源最短路徑問題,該演算法要求所有邊的權重都為非負值。演算法重複從結點集 v s中選擇最短路徑估計最小的結點 u 將 u 加入到集合 s 然後對所有從 u 出發的邊進行 鬆弛操作 相當於遍歷選出最小權值 使用乙個最小優先佇列 q 來儲存結點集合...