最短路之dijkstra及其堆優化

2021-10-07 18:35:45 字數 1887 閱讀 1252

dijkstra演算法用來解決單源最短路徑問題

通常來說就是求解乙個圖中兩節點的最短路徑(只適用於正權邊)

該演算法的樸素想法是鬆弛的思想

即若dis ( 1->3 ) = 7

dis ( 1->2 ) = 1

dis ( 2->3 ) = 1

則節點2的存在就可以對1,3鬆弛

在鬆弛完乙個節點之後要選擇尚未進行鬆弛的節點鬆弛,且要選擇距起點距離最近的點

///樸素dijkstra o(n^2+m)

int g[n]

[n];

// 儲存每條邊

int dist[n]

;// 儲存1號點到每個點的最短距離

bool st[n]

;// 儲存每個點的最短路是否已經確定

// 求1號點到n號點的最短路,如果不存在則返回-1

intdijkstra()

if(dist[n]

==0x3f3f3f3f

)return-1

;return dist[n];}

///**是從y總那偷的qaq

///堆優化的dijkstra o(mlogn)

typedef pair<

int,

int> pii;

///改用結構體也可

int n;

// 點的數量

int h[n]

, w[n]

, e[n]

, ne[n]

, idx;

// 鄰接表儲存所有邊

int dist[n]

;// 儲存所有點到1號點的距離

bool st[n]

;// 儲存每個點的最短距離是否已確定

// 求1號點到n號點的最短距離,如果不存在,則返回-1

intdijkstra()

);// first儲存距離,second儲存節點編號

while

(heap.

size()

));}

}}if(dist[n]

==0x3f3f3f3f

)return-1

;return dist[n];}

///**是從y總那偷的qaq

///自己寫的比較順手的dij

#include

using

namespace std;

struct edge

;struct node

} d[

100005];

const

int inf=

0x3f3f3f3f

;vector ve[

100005];

priority_queue qu;

bool vis[

100005];

void

build

(int u,

int v,

int l)

intmain()

for(

int i=

1; i<=n; i++

) d[i]

.l=inf,d[i]

.idx=i;

d[s]

.l=0

; qu.

push

(d[s]);

while

(!qu.

empty()

)}}for

(int i=

1; i<=n; i++

)printf

("%d "

,d[i]

.l);

return0;

}

因為該節點一定無法距起點更近

最短路之dijkstra

覺得這篇博文講的很不錯 click here 下面的 可直接用來ac這道題目 hdu 暢通工程續 click here 乙個用鄰接矩陣存圖的模板。鄰接矩陣存圖主要用於點比較少的 5000個點還是可以的 邊比較多的情況。由於二位陣列不能開過於大,所以這也是鄰接矩陣存圖的限制吧!djk求單源最短路,鄰接...

最短路之dijkstra演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有 節點的最短路徑。主要特點是 以起始點為中 心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點...

模版 堆優化Dijkstra求最短路

一 堆優化的主要思想就是使用乙個優先佇列 就是每次彈出的元素一定是整個佇列中最小的元素 來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。幾個細節 優先佇列的資料型別 優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得...