Dijkstra最短路徑

2021-08-17 04:04:16 字數 1404 閱讀 2580

**《演算法筆記》

dijkstra演算法解決的是單源最短路問題,即給定圖g(v,e)和起點s(起點又稱為源點),求從起點s到達其它頂點的最短距離

dijkstra演算法的策略是:

設定集合s存放已被訪問的頂點,然後執行n次下面的兩個步驟(n為頂點個數):

1.    每次從集合v-s中選擇與起點s的最短距離最小的乙個頂點(記為u),訪問並加入集合s。

2.    令頂點u為中介點,優化起點s與所有從u能到達的頂點v之間的最短距離

dijkstra演算法的具體實現:

1.    集合s可以用乙個bool型陣列vis來實現,即當vis[i]==true時表示頂點vi已被訪問,當vis[i]==false時表示頂點vi未被訪問。

2.    令int型陣列d表示起點s到達頂點vi的最短距離,初始時除了起點s的d[s]賦為0,其餘頂點都賦為乙個很大的數(初學者可以用1000000000,稍微懂點二進位制編碼的話可以使用十六禁止0x3fffffff,但不要使用0x7fffffff,因為兩個這樣的數相加可能回超過int的表示範圍),來表示inf。

題目,給出,輸出從起點v0到達所用頂點的最短距離

輸入:6 8 0        //n,m,w分別表示頂點個數,邊數,起點編號

0 1 1        //隨後m行輸入每條邊的兩個頂點和邊的權值

0 3 4

0 4 4

1 3 2

2 5 1

3 2 2

3 4 3

4 5 3

輸出:0 1 5 3 4 6

#include #include using namespace std;

const int maxv = 1000; //最大頂點數

const int inf = 1000000000; //設inf為乙個很大的數

int n, m, s, g[maxv][maxv]; //n為頂點數,m為邊數,s為起點

int d[maxv]; //起點到達各點的最短路徑長度

bool vis[maxv] = ; //標記陣列,vis[i]==true表示已訪問。初值均為false

void dijkstra(int s)

} //找不到小於inf的d[u],說明剩下的頂點和起點s不連通

if (u == -1) return;

vis[u] = true; //標記u為已訪問

for (int v = 0; v < n; v++)

} }}int main()

dijkstra(s); //dijkstra演算法入口

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

cout << d[i] << " ";

return 0;

}

Dijkstra 最短路徑

dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...

最短路徑 Dijkstra

首先,提出兩點 一 如果把不帶權圖上的所有邊的權值均定義為1,則該不帶權圖可以歸結為帶權圖 二 如果把無向圖中的每一條邊 vi,vj 都定義為弧和弧,則該無向圖可以歸結為有向圖。因此不失一般性,我們只用看有向帶權圖怎麼求解最短路徑問題就ok。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...