單源最短路(dijkstra演算法及堆優化)
弱化版題目鏈結
n^2 dijkstra模板
1 #include2 #include3 #include4 #include5using
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 #include5using
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...