dijkstra最短路優化小結

2021-08-29 08:00:33 字數 2210 閱讀 6229

堆優化把所有dish[i]放在優先佇列中,取堆頂dist[u]最小值更新

#include

#include

#include

#define maxn 100001

#define maxm 400001

using namespace std;

struct e };

int n,m,s,v[maxm]

,next[maxm]

,head[maxn]

,w[maxm]

,dis[maxn]

,tot;

inline

void

insert

(int x,

int y,

int z)

priority_queueq;

inline

void

dijkstra()

);while

(!q.

empty()

));}

}}intmain()

配對堆優化

#include

#include

#include

#define inf 10000000000000000ll

#include

using namespace std;

typedef pair<

long

long

,int

> pii;

//priority_queue , greater> q;

using namespace __gnu_pbds;

typedef __gnu_pbds:

:priority_queue

, pairing_heap_tag > heap;

heap:

:point_iterator id[

1000005];

struct node

a[10000005];

int tot, n, m, s;

long

long dis[

1000005];

int rp, t, first[

1000005];

void

addedge

(int st,

int end,

int val)

intdij

(int s)}}

}int

main()

dij(s)

;for

(int i =

1; i <= n ; i++

)printf

("%d "

,dis[i]);

printf

("\n");

}

zkw線段樹優化

如果t[1]!=max,說明還有可以優化的dist,往下找到最小的dist進行更新

#include

#include

#include

#include

using namespace std;

const

int maxn=

1e5+1;

const

int maxm=

2e5+1;

template

inline

void

read

(t& t)

int n,m,s,m=

1,v[maxm]

,next[maxm]

,w[maxm]

,head[maxn]

,d[maxn]

,t[262145];

inline

voidu(

int x,

int p)

inline

intf()

intmain()

}for

(int i=

1;i<=n;i++

)printf

("%d "

,d[i]);

printf

("\n");

return0;

}

模版 堆優化Dijkstra求最短路

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

Dijkstra求最短路(樸素and堆優化)

題目來自acwing 題目描述 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸出格式...

最短路之dijkstra及其堆優化

dijkstra演算法用來解決單源最短路徑問題 通常來說就是求解乙個圖中兩節點的最短路徑 只適用於正權邊 該演算法的樸素想法是鬆弛的思想 即若dis 1 3 7 dis 1 2 1 dis 2 3 1 則節點2的存在就可以對1,3鬆弛 在鬆弛完乙個節點之後要選擇尚未進行鬆弛的節點鬆弛,且要選擇距起點...