單源最短路模板(dijkstra)

2022-05-05 21:30:09 字數 2096 閱讀 7072

單源最短路(dijkstra演算法及堆優化)

弱化版題目鏈結

n^2 dijkstra模板

1 #include2 #include3 #include4 #include5

using

namespace

std;

6int i,j,n,m,s,dis[10010];7

bool v[10010];8

struct

node node[10010

];13 node *head[10010

];14

intmain()

1523

intx,y,w;

24for(i=1;i<=m;i++)

2533

for(node *h=head[s]->next;h;h=h->next)

34 dis[h->to]=min(dis[h->to],h->w);    //注意可能有重邊

35 v[s]=1

;36 dis[s]=0;37

for(i=1;i<=n;i++)

3846

if(k==-1) break

;47 v[k]=1;48

for(node *h=head[k]->next;h;h=h->next)

49if(!v[h->to]&&dis[h->to]>dis[k]+h->w)

50 dis[h->to]=dis[k]+h->w;51}

52for(i=1;i<=n;i++)

53 printf("

%d "

,dis[i]);

54 puts(""

);55

return0;

56 }

毒瘤標準版

直到做了這個題才發現我之前寫的堆優化dijkstra一直是錯的。。

這個堆優化其實很容易理解,將列舉最小值改為從堆中取出最小值,改變dis時入堆即可

用優先佇列維護時必須有兩個值:點的編號和當前的距離

以距離為標準從小到大排序, 每次取出最小的

以前錯的原因:

堆中只維護了點的編號,以dis[x]排序

這樣做在取出乙個元素操作後,會更新它周圍一圈元素的dis值,

若它周圍一圈元素中有的在堆中,dis值被改變後,堆的性質會遭到破壞

然而由於弱化版太水了,我在做毒瘤版之前一直認為這是對的

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define il inline

7#define re register

8#define n 100010

9#define m 200010

10int

n,m,s,dis[n];

11struct

node;

15struct

cmp19

};20 priority_queue,cmp>q;

21 il int

read()

25return

x;26}27

void write(int

x)31

struct

node e[m];

34int

head[n],num;

35 il void add(int x,int y,int

w)41

bool

used[n];

42int

main()

4350 memset(dis,127,sizeof

(dis));

51 dis[s]=0

;52 q.push((node));

53while(!q.empty()));64}

65}66}

67for(re int i=1;i<=n;i++)

68 write(dis[i]),putchar('');

69return0;

70 }

Dijkstra求單源最短路模板

1 include2 include3 include4 include5 include6 define max 99999997 8usingnamespacestd 9 pair 的first 儲存的為最短距離,second儲存的為頂點編號 10 typedefpair int,int p 對...

單源最短路徑 模板 dijkstra

p4779 模板 單源最短路徑 標準版 原題鏈結 鏈式前向星 題目描述 給定乙個 n個點,m條有向邊的帶非負權圖,請你計算從 s 出發,到每個點的距離。資料保證你能從 s 出發到任意點。輸入格式 第一行為三個正整數 n,m,s。第二行起 m 行,每行三個非負整數 ui,vi,wi表示從ui到 vi ...

dijkstra優化模板 單源最短路模板

include include 很重要 using namespace std vectorg 100005 記錄乙個點和那些邊相連 vectorl 100005 記錄乙個點和別的邊的長度 int d 100005 起點到每一點的距離 bool done 100005 標記是否走過 const in...