dijkstra最短路演算法

2021-07-24 23:17:13 字數 1860 閱讀 7659

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中。

執行動畫過程如下圖

3.演算法例項

先給出乙個無向圖

用dijkstra演算法找出以a為起點的單源最短路徑步驟如下

4.program:(不是上面這道題的**)

#include#include#includeusing namespace std;

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

const int inf = 0x3f3f3f3f;

int n, m, p, q;

void dijstar(int x)

if(min2 == inf)

break;

vis[temp] = 1; //標記該點已經被鬆弛過

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

if(map[temp][j] < inf && dis[j] > dis[temp] + map[temp][j])

}}int main()

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

scanf("%d", n+i);

for(int i = 0; i < p; i++)

int min1 = inf;

dijstar(q);

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

printf("%d\n", min1);

}return 0;

}

最短路 Dijkstra演算法

dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...

最短路 Dijkstra演算法

這是一類求單源最短路的演算法,也就是求某乙個頂點到其他所有頂點的最短路。它是按照最短路徑遞增的順序來計算的。先說一下大體思路 將圖中的頂點分為兩個集合,s,v s。s儲存已經求出最短路徑的頂點,v s儲存未求出最短路的頂點。然後演算法就是不斷額的求出v s中頂點的最短路,然後把它加入s中,直到所有頂...

最短路 Dijkstra演算法

對有向圖,無向圖均有效。要求,權值為正。貪心。每次取距離s最近的點,來更新其他點。bfs。將權值看成單位長度的路徑之和,最近的點即bfs最先達到的點。定義delta u,v 若u,v不可達,值為無窮。若u,v可達,則delta u,v 即u,v間最短距離。鬆弛操作 relax u,v,w if d ...