單源最短路 狄克斯特拉演算法

2022-05-16 21:24:04 字數 2413 閱讀 6925

一般形式的用鄰接矩陣來實現dijkstra效率比較低,我這裡直接記錄的是用鄰接表的方法以及用優先佇列加以應用。

首先解釋什麼是dijkstra演算法

dijkstra演算法

dijkstra演算法適用於求單源最短路,即可以求出起點到其餘各點之間的最短路。它的演算法實現是乙個不斷更新的過程。

舉乙個最簡單的例子,假設有這麼乙個圖

,紅色表示權值,黑色表示4個點以及路徑,我們假設起點為1,用d[i]來表示1到i的最短路,那麼在第一輪的時候,d[2]=1,d[3]=1,d[4]=5,再下一輪的時候會對這個情況進行更新,結果為d[2]=1,d[3]=1,d[4]=4,以此類推,會一直更新到d[2]=1,d[3]=1,d[4]=3為止,所以我認為該演算法是乙個不斷更新的過程。

鄰接表表示法

鄰接表表示法我們使用vector以及pair兩種工具,可以極大的節省空間以及演算法實現中遍歷搜尋的時間,舉乙個例子

該圖的鄰接表表示為

,具體實現可以看**

洛谷p1346

解題思路大概就是把預設指向的軌道的權值設為0,需要開關的軌道權值設為1。

1 #include 2 #include 3 #include 

4 #include 5 #include 6 #include 7 #include 8 #include 9 #include

10using

namespace

std;

11#define ll long long

12static

const

int white=0;//

未選13

static

const

int gray=1;//

備選14

static

const

int black=2;//

已選15

static

const

int infty=(1

<<20

);16

intn,a,b;

17 vectorint,int> > adj[105];//

加權圖的鄰接表表示法

18void

dijkstra()

1927 d[a]=0;//

設定起點

28 que.push(make_pair(0

,a));

29 color[a]=gray;

30while (!que.empty())

3149}50

}51if(d[b]==infty)

52 cout<

<

53else

545758}

59int

main()

6072

for(int j=2;j<=k;j++)

7377}78

dijkstra();

79return0;

80 }

洛谷p1339

1 #include 2 #include 3 #include 

4 #include 5 #include 6 #include 7 #include 8 #include 9 #include

10using

namespace

std;

11#define ll long long

12static

const

int white=0;13

static

const

int gray=1;14

static

const

int black=2;15

static

const

int infty=(1

<<20

);16

intt,c,ts,te;

17 vectorint,int> > adj[2505

];18

void

dijkstra()

1927 d[ts]=0

;28 que.push(make_pair(0

,ts));

29 color[ts]=gray;

30while (!que.empty())

3149}50

}51 cout

53int

main()

5464

dijkstra();

65return0;

66 }

單源最短路徑問題(狄克斯特拉演算法)

挑戰程式設計競賽2上的一道例題 p250 include using namespace std static const int max 100 static const int infty 1 21 這裡表示int型別最大值 static const int white 0 表示三種狀態 sta...

狄克斯特拉演算法

廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...

狄克斯特拉演算法

是由荷蘭計算機科學家狄克斯特拉於1959 年提出的。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向無環圖中最短路徑問題,且不能有負權邊。狄克斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。示例 找出從起點到終點的最短路徑 當前起點到各點的花費,選擇最小且沒有被檢...