• 最短路--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 }
  • 相关阅读:
    将Oracle数据库设置为归档模式 & Oracle 9i启动归档
    修改用户家目录
    使用Pam_Tally2锁定和解锁SSH失败的登录尝试
    linux系统用户锁定与解锁
    Linux用户密码过期 FAILED to authorize user with PAM (Authentication token is no longer valid; new one req)
    普通用户通过sudo su
    两台服务器配置互信
    red hat官方的rhel操作系统版本号与内核版本号的对应关系
    linux修改IP地址
    Docker学习(12) Dockerfile构建过程
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4454381.html
Copyright © 2020-2023  润新知