堆优DIJ模板

摘要:
Dij算法过程:d数组记录从源点s到每个点的距离。如果没有边,则将其设置为inf,并标记源点;选择d数组中未标记的最小值,节点标记为k,k标记为找到的最短路径;枚举每个节点(标记为j)。如果j到k的路径˂d[j]且未被标记,则更新d[j】;重复2步和3步n次;D[v]是s-v的最短路径;堆优化的dij:时间复杂度为O的堆优化的dij算法;(但据说它比spfa运行得更快?经过测试后,无需标记。堆优化的dij根据dij模板进行修改,以寻求解释。..=-1;i=e[i].next){//遍历相邻节点45v=e[i].to;46if{47d[v]=u.value+e[i].w;//松弛操作48q.push;//推入新节点49}50}51}52}5354intmain(){55intn,p,c,ans=999999999999,i,j,u,v,w;56memset;57memset;58scanf;59forscanf;60for{61scanf;62add;63add;//连接边64}65用于{66dij;67intsum=0;68forsum+=d[a[j]];69ans=min;70}71printf;72}

Dij:贪心思想的单源最短路,时间复杂度O(n^2)。

Dij算法流程:

  1. d数组记录源点s到每个点的距离,若无边则设为inf,标记源点;
  2. 选出d数组中未标记的最小值,该节点记为k,并标记k为已求出最短路;
  3. 枚举每个节点(记为j),若经过k到达j的路径<d[j]且未标记,则更新d[j];
  4. 重复2、3步n次;
  5. d[v]为s-v的最短路;

堆优Dij:即用堆优化的dij算法,时间复杂度O(nlogn);(但是据说跑起来比spfa快?求神犇解释)

堆优Dij算法流程:

  1. q为priority_queue,优先队列记录一个二元组,分别为索引位置和数值;

    d数组记录源点s到每个点的距离,若无边则设为inf;

  2. 源点入队;
  3. 队首出队并标记队首;
  4. 遍历队首的邻接点,若可松弛,则更新该邻接点的最短路并将该节点压入优先队列;

不知道为什么,写出来的spfa和堆优dij的唯一区别就是spfa的队列变成了dij的优先队列,也不知道这样对不对,若有错误希望大家指出。

经测试,其实无需标记,堆优dij是照着dij模板改的,求解释。。。

例题:Codevs2038香甜的黄油

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<queue>
 4 #include<vector>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 struct edge{
 9     int to;
10     int w;
11     int next;
12 };
13 
14 struct node{
15     int index,value;
16     node(){};
17     node(int x,int y){index=x;value=y;}//构造函数
18     friend bool operator < (node a,node b){
19         return a.value>b.value;
20     }//重载小于号
21 };
22 
23 priority_queue<node> q;
24 edge e[10000];
25 int ne=0,head[1000],d[1000],a[1000],answer[1000]={0};
26 bool b[1000];
27 
28 void add(int a,int b,int c){
29     e[++ne].to=b;e[ne].w=c;e[ne].next=head[a];head[a]=ne;
30 }
31 
32 void dij(int k){//k为源点编号
33     int i,v;
34     node u;
35     memset(d,127,sizeof(d));
36     memset(b,0,sizeof(b));//初始化
37     d[k]=0;
38     //b[k]=true;
39     q.push(node(k,0));//构造并压入源点
40     while(!q.empty()){
41         u=q.top();q.pop();//弹出队首
42         //if(b[u.index])continue;
43         //b[u.index]=true;//标记
44         for(i=head[u.index];i!=-1;i=e[i].next){//遍历邻接点
45             v=e[i].to;
46             if(u.value+e[i].w<d[v]/*&&b[v]==false*/){
47                 d[v]=u.value+e[i].w;//松弛操作
48                 q.push(node(v,d[v]));//压入新节点
49             }
50         }
51     }
52 }
53 
54 int main(){
55     int n,p,c,ans=999999999,i,j,u,v,w;
56     memset(head,-1,sizeof(head));
57     memset(e,0,sizeof(e));
58     scanf("%d%d%d",&n,&p,&c);
59     for(i=1;i<=n;i++)scanf("%d",&a[i]);
60     for(i=1;i<=c;i++){
61         scanf("%d%d%d",&u,&v,&w);
62         add(u,v,w);
63         add(v,u,w);//连边
64     }
65     for(i=1;i<=p;i++){
66         dij(i);
67         int sum=0;
68         for(j=1;j<=n;j++)sum+=d[a[j]];
69         ans=min(ans,sum);
70     }
71     printf("%d
",ans);
72 }

 

 

免责声明:文章转载自《堆优DIJ模板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇2019年第十届蓝桥杯国赛总结(JavaA组)Django中CSS加载background url('')问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Sqlite可视化工具sqliteman安装(转)

Sqlite可视化工具sqliteman安装1.安装前的系统要求:RedHat6.9Qt库版本:4.2及更高版本2.当以源代码模式安装时,您可以在以下地址下载安装文件https://sourceforge.net/projects/sqliteman/files/sqliteman/1.2.2/3.安装1)将tar包上载到Linux,2)tarxvfsqli...

Mock 基本使用

特殊的格式,例如IP,随机数,图片,地址,需要去收集二、mock优点1、前后端分离让前端工程师独立于后端进行开发。表示需要拦截的Ajax请求类型。表示数据模板,可以是对象或字符串。表示用于生成响应数据的函数。...

Ubuntu安装时怎样分区

应该首先放置启动分区。并将引导设置为主分区。如果是双系统或多系统安装,通常可以选择逻辑分区。首先,Grub可以在1024柱面后面引导Linux内核;第二,即使有多个Linux安装,/boot也可以完全不共享。此外,非独立/引导分区仅占用根文件夹下约20MB的空间。所以决定是否启动。...

ClickHouse之访问权限控制

Ck当前只有select和insert。这是我刚才提到的:60cd41aedc4e47e8883682b416109e7b7e345e15ecc63c2c98ecdab5e8e053a只读defaultdefault此部分意味着添加具有只读权限的dba用户。允许访问的数据库是默认值。源IP不受限制::/0尝试以dba用户身份登录:clickhouse-cli...

win10 .net3.5的问题及解决方案

小编下面就介绍win1064位系统无法安装Netframework3.5的两种解决方案吧在Windows10中,当我们安装某些软件的时候会提示“你的电脑上的应用需要使用以下Windows功能:.NETFramework3.5”。但近日有网友反映在windows10_64位系统电脑上安装Netframework3.5,操作时总是遇到失败的情况。下面小编就为大家...

fiddler抓包+雷电模拟器 完成手机app抓包的配置

找到系统应用,点击设置,点击无线网络WLAN—˃左键常按点击已连接网络—˃修改网络鼠标左键长按在桌面找到下面这个文件之后双击打开上面证书弄完之后。可以说本机已经安装过证书了,如果你能在模拟器上找到这个证书就不用将这个证书再拉入模拟器了在模拟器中打开系统应用—˃设置—˃安全—˃从SD卡安装。找到FiddlerRoot.cer文件,按提示导入即可,注意在此过程需...