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