zoukankan      html  css  js  c++  java
  • 最短路--dijkstra+优先队列优化模板

    不写普通模板了,还是需要优先队列优化的昂

     1 #include<stdio.h>        //基本需要的头文件
     2 #include<string.h>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<vector>
     6 using namespace std;
     7 typedef pair<int,int> pii;
     8 const int INF=0x3f3f3f3f;
     9 
    10 const int maxn=1e5+5;
    11 const int maxm=1e5+5;
    12 
    13 int head[maxn],nxt[maxm<<1],val[maxm<<1],point[maxm<<1],size;
    14 int dis[maxn];
    15 
    16 void init(){
    17     memset(head,-1,sizeof(head));
    18     size=0;
    19 }
    20 
    21 void add(int a,int b,int v){    //若有向图则只需要前一半
    22     point[size]=b;
    23     val[size]=v;
    24     nxt[size]=head[a];
    25     head[a]=size++;
    26 
    27     point[size]=a;
    28     val[size]=v;
    29     nxt[size]=head[b];
    30     head[b]=size++;
    31 }
    32 
    33 struct cmp{                        //将优先队列改为小根堆
    34     bool operator()(pii a,pii b){
    35         return a.first>b.first;
    36     }
    37 };
    38 
    39 void dij(int s,int t){            //传入出发点和到达点
    40     int i;
    41     priority_queue<pii,vector<pii>,cmp>q;
    42     q.push(make_pair(0,s));
    43     memset(dis,0x3f,sizeof(dis));
    44     dis[s]=0;
    45     while(!q.empty()){
    46         pii u=q.top();
    47         q.pop();
    48         if(u.first>dis[u.second])continue;
    49         for(i=head[u.second];~i;i=nxt[i]){
    50             int j=point[i];
    51             if(dis[j]>u.first+val[i]){
    52                 dis[j]=u.first+val[i];
    53                 q.push(make_pair(dis[j],j));
    54             }
    55         }
    56     }
    57     printf("%d
    ",dis[t]);        //或去掉在主函数中输出或操作
    58 }

    最开始是因为寒假集训的时候学长讲的用pair存进优先队列的,实际上我更喜欢用结构体重载运算符来实现,所以也放上来。

    另外……之前上面的代码里……有个size打成了sise,但是因为平时直接手敲,所以没有用这个贴过题,一直没有发现,甚至还看到有某些不明真相的网站把这篇复制粘贴过去了,非常的尴尬233333

    反正我不尴尬啦

     1 #include<stdio.h>        //基本需要的头文件
     2 #include<string.h>
     3 #include<queue>
     4 #include<algorithm>
     5 using namespace std;
     6 const int INF=0x3f3f3f3f;
     7 
     8 const int maxn=1e3+5;
     9 const int maxm=1e5+5;
    10 
    11 struct pii{
    12     int dis;
    13     int s;
    14     bool operator < (const pii x)const{
    15         return dis > x.dis;
    16     }
    17     pii(int a,int b):dis(a),s(b){};
    18 };
    19 int head[maxn],nxt[maxm<<1],val[maxm<<1],point[maxm<<1],size;
    20 int dis[maxn];
    21 
    22 void init(){
    23     memset(head,-1,sizeof(head));
    24     size=0;
    25 }
    26 
    27 void add(int a,int b,int v){
    28     point[size]=b;
    29     val[size]=v;
    30     nxt[size]=head[a];
    31     head[a]=size++;
    32 }
    33 
    34 void dij(int s,int t){            //传入出发点和到达点
    35     int i;
    36     priority_queue<pii>q;
    37     q.push(pii(0,s));
    38     memset(dis,0x3f,sizeof(dis));
    39     dis[s]=0;
    40     while(!q.empty()){
    41         pii u=q.top();
    42         q.pop();
    43         if(u.dis>dis[u.s])continue;
    44         for(i=head[u.s];~i;i=nxt[i]){
    45             int j=point[i];
    46             if(dis[j]>u.dis+val[i]){
    47                 dis[j]=u.dis+val[i];
    48                 q.push(pii(dis[j],j));
    49             }
    50         }
    51     }
    52     printf("%d
    ",dis[t]);        //或去掉在主函数中输出或操作
    53 }
  • 相关阅读:
    经常让程序员恼火的一些事情你是否也遇到过一些?
    CRC文件解压缩问题
    你在淘宝买件东西背后的复杂技术 技术普及帖
    程序员需要戒骄戒躁
    IT路上的应该注意自我规划 学习规划与自我修炼
    腾讯,我最恨别人用枪顶着我的头(转)
    软件管理,软件生命周期,软件过程名词解释
    程序员需要掌握的最终技术是什么? “终极技术”:应对困境的方法和信念
    程序员如何缓解“电脑病”
    新浪微博XSS攻击事件
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4454381.html
Copyright © 2011-2022 走看看