堆优化dijkstra+set优化dijkstra

Posted hyghb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆优化dijkstra+set优化dijkstra相关的知识,希望对你有一定的参考价值。

...好尴尬啊

我一直以为堆优化是nlogm的,,,甚至还狠狠嘲讽过哪些认为是mlogm的。

上次在cf上被卡了之后才知道自己的dijkstra一直是是写错的。

这次补上正确的模板。。。。

然后又了解到了set优化dijkstra,是nlogn的,很优秀。

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int inf=6205;
 4 int n,m,s,t;
 5 int tot,fi[inf],nxt[inf<<1],cost[inf<<1],to[inf<<1];
 6 void link(int x,int y,int z){
 7     to[++tot]=y;nxt[tot]=fi[x];fi[x]=tot;cost[tot]=z;
 8 }
 9 struct dij{
10     int id,val;
11     bool operator < (const dij &o)const{
12         return val<o.val;
13     }
14 };
15 int dis[inf];
16 set<dij>S;
17 void dijkstra(){
18     memset(dis,0x3f,sizeof(dis));
19     dis[s]=0;
20     S.insert((dij){s,0});
21     while(!S.empty()){
22         dij u=*S.begin();
23         S.erase(u);
24         for(int i=fi[u.id];i;i=nxt[i]){
25             if(dis[to[i]]>dis[u.id]+cost[i]){
26                 if(S.find((dij){to[i],dis[to[i]]})!=S.end())S.erase((dij){to[i],dis[to[i]]});
27                 dis[to[i]]=dis[u.id]+cost[i];
28                 S.insert((dij){to[i],dis[to[i]]});
29             }
30         }
31     }
32     printf("%d\n",dis[t]);
33 }
34 int main()
35 {
36     freopen("heatwvx.in","r",stdin);
37     freopen("heatwvx.out","w",stdout);
38     scanf("%d%d%d%d",&n,&m,&s,&t);
39     for(int i=1;i<=m;i++){
40         int x,y,z;
41         scanf("%d%d%d",&x,&y,&z);
42         link(x,y,z);link(y,x,z);
43     }
44     dijkstra();
45     return 0;
46 }
set
技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int inf=6205;
 4 int n,m,s,t;
 5 int tot,fi[inf],nxt[inf<<1],cost[inf<<1],to[inf<<1];
 6 void link(int x,int y,int z){
 7     to[++tot]=y;nxt[tot]=fi[x];fi[x]=tot;cost[tot]=z;
 8 }
 9 struct dij{
10     int id,val;
11     bool operator < (const dij &o)const{
12         return val>o.val;
13     }
14 };
15 int dis[inf];
16 bool vis[inf];
17 priority_queue<dij>S;
18 void dijkstra(){
19     memset(dis,0x3f,sizeof(dis));
20     dis[s]=0;
21     S.push((dij){s,0});
22     while(!S.empty()){
23         dij u=S.top();
24         S.pop();
25         if(vis[u.id])continue;
26         vis[u.id]=1;
27         for(int i=fi[u.id];i;i=nxt[i]){
28             if(dis[to[i]]>dis[u.id]+cost[i]){
29                 dis[to[i]]=dis[u.id]+cost[i];
30                 S.push((dij){to[i],dis[to[i]]});
31             }
32         }
33     }
34     printf("%d\n",dis[t]);
35 }
36 int main()
37 {
38     freopen("heatwvx.in","r",stdin);
39     freopen("heatwvx.out","w",stdout);
40     scanf("%d%d%d%d",&n,&m,&s,&t);
41     for(int i=1;i<=m;i++){
42         int x,y,z;
43         scanf("%d%d%d",&x,&y,&z);
44         link(x,y,z);link(y,x,z);
45     }
46     dijkstra();
47     return 0;
48 }
priority_queue

以上是关于堆优化dijkstra+set优化dijkstra的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra求最短路 (堆优化版)

堆优化dijkstra+set优化dijkstra

Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

hdu3790 dijkstra+堆优化(最好还是不要去优化 Orz,Orz)

Dijkstra算法介绍及其优先队列优化和斐波那契堆优化

配对堆优化Dijkstra算法小记