單源最短路徑 Dijkstra 優先佇列

2021-09-11 20:21:39 字數 1479 閱讀 4122

1找到最短距離已經確認的頂點,從它出發更新相鄰頂點的最短距離

2此後不需要關心1中的「最短距離已經確認的頂點」

堆中元素共有o(v)個,更新和取出都有o(e)次,每次更新或取出堆的維護時間是o(lo**),因此該演算法的時間複雜度為o(elo**).

輸入兩個整數v,e,分別表示有向圖(無向圖就多新增一倍的邊)的的節點數,和邊數

接下來e行,每行三個整數,分別表示,無向圖邊的連個端點以及權值

輸出一行v個整數,表示每個點到起點的最短路徑

7 10

1 2 2

1 3 5

2 3 4

3 4 2 

2 4 6 

4 6 1

2 5 10

5 6 3

5 7 5

6 7 9

有向:0 2 5 7 12 8 17

無向:0 2 5 7 11 8 16

#include#include#includeusing namespace std;

const int max_v=10005;

const int inf=0x3f3f3f;

struct edge

};typedef pairp;//first是最短距離,second是頂點編號

int v;//頂點數

int e;//邊數

vectorg[max_v];

int d[max_v];

void read()

} }}

int main()

/*

7 10

1 2 2

1 3 5

2 3 4

3 4 2

2 4 6

4 6 1

2 5 10

5 6 3

5 7 5

6 7 9

0 2 5 7 12 8 17

*/#include#include#includeusing namespace std;

const int max_v=10005;

const int inf=0x3f3f3f;

struct edge

};typedef pairp;//first是該點入隊時的最短距離,second是頂點編號

int v;//頂點數

int e;//邊數

vectorg[max_v];

int d[max_v];

void read()

} }}

int main()

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra單源最短路徑

dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...