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 }
  • 相关阅读:
    三个心态做人做学问 沧海
    成功走职场要找准自己的"快捷键" 沧海
    免费离线下载 拂晓风起
    Hibernate 获取某个表全部记录时 奇怪现象 (重复出现某个记录) 拂晓风起
    无法读取mdb 如果连接不了ACCESS mdb文件,就尝试安装MDAC 拂晓风起
    Netbeans 使用 Hibernate 逆向工程 生成hbm和pojo 拂晓风起
    如何点击单选框 radio 后面的文字,选中单选框 拂晓风起
    Java 连接access 使用access文件 不用配置 拂晓风起
    mysql下如何执行sql脚本 拂晓风起
    Hibernate配置access Hibernate 连接 access 拂晓风起
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4454381.html
Copyright © 2011-2022 走看看