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香甜的黄油

 #include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<cstring>
using namespace std; struct edge{
int to;
int w;
int next;
}; struct node{
int index,value;
node(){};
node(int x,int y){index=x;value=y;}//构造函数
friend bool operator < (node a,node b){
return a.value>b.value;
}//重载小于号
}; priority_queue<node> q;
edge e[];
int ne=,head[],d[],a[],answer[]={};
bool b[]; void add(int a,int b,int c){
e[++ne].to=b;e[ne].w=c;e[ne].next=head[a];head[a]=ne;
} void dij(int k){//k为源点编号
int i,v;
node u;
memset(d,,sizeof(d));
memset(b,,sizeof(b));//初始化
d[k]=;
//b[k]=true;
q.push(node(k,));//构造并压入源点
while(!q.empty()){
u=q.top();q.pop();//弹出队首
//if(b[u.index])continue;
//b[u.index]=true;//标记
for(i=head[u.index];i!=-;i=e[i].next){//遍历邻接点
v=e[i].to;
if(u.value+e[i].w<d[v]/*&&b[v]==false*/){
d[v]=u.value+e[i].w;//松弛操作
q.push(node(v,d[v]));//压入新节点
}
}
}
} int main(){
int n,p,c,ans=,i,j,u,v,w;
memset(head,-,sizeof(head));
memset(e,,sizeof(e));
scanf("%d%d%d",&n,&p,&c);
for(i=;i<=n;i++)scanf("%d",&a[i]);
for(i=;i<=c;i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);//连边
}
for(i=;i<=p;i++){
dij(i);
int sum=;
for(j=;j<=n;j++)sum+=d[a[j]];
ans=min(ans,sum);
}
printf("%d\n",ans);
}

堆优DIJ模板的更多相关文章

  1. B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij

    B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...

  2. [CF1209F]Koala and Notebook_堆优化dij

    Koala and Notebook 题目链接:https://codeforces.com/contest/1209/problem/F 数据范围:略. 题解: 开始的时候看错题了....莫名其妙多 ...

  3. [CF1146D]Frog Jumping_exgcd_堆优化dij

    Frog Jumping 题目链接:http://codeforces.com/contest/1146/problem/D 数据范围:略. 题解: 首先发现,如果$x\ge a +b$,那么所有的$ ...

  4. 【模板】堆优化 + dij +pair 存储

    就是短 感谢Cptraserdalao的博客 #include<bits/stdc++.h> using namespace std; struct node { int val,num; ...

  5. 链式前向星实现的堆优化dij求最短路模板

    #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...

  6. 【洛谷P1462】【二分+堆优化dij】

    题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每次经过一个城市,都会被收取 ...

  7. 堆优化dij

    #include<iostream> #include<cstdio> #include<queue> using namespace std; ],head[], ...

  8. 2017多校第9场 HDU 6166 Senior Pan 堆优化Dij

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值. 解法:枚举二进制位 ...

  9. 【luogu P3377 左偏树(可并堆)】 模板

    题目连接:https://www.luogu.org/problemnew/show/P3377 #include <cstdio> #include <cstring> #i ...

随机推荐

  1. UML-快速的更新分析

    1.目标 本章主要介绍需求和领域分析中的一些变更. 迭代1阶段:结束时,举行为期1-2天的简短的需求讨论会,内容是调查和详细编写更多需求+解决初始阶段反馈问题. 迭代2阶段:结束时,举行为期1-2天的 ...

  2. XCOM串口助手打印不出数据

    本次实验是在基于原子的战舰开发板上的做定时器捕获实验,程序源码下载到板子上运行正常.指示灯正常显示,打开XCOM识别不来串口,原因:硬件上没有插USB转串口线: 连接上USB转串口线,软件上以显示CH ...

  3. python获取页面文字信息

    # -*- coding: utf- -*- from selenium import webdriver import time, re,requests,os,time,random,traceb ...

  4. sublime3激活方法

    激活方法参考这里 $ tail -n4 /etc/hosts # https://blog.csdn.net/DeMeng33/article/details/80536926 127.0.0.1 w ...

  5. 吴裕雄--天生自然ShellX学习笔记:Shell 数组

    数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. Shell 数组用括号来 ...

  6. 一个理解基本RCNN的简单例子

    对于一个最简单的RNN网络https://github.com/Teaonly/beginlearning/ """Minimal character-level Van ...

  7. Halcon中将16位的图像转化为8位的图像

    Halcon中Image有多种像素表示方式,这方面网上找到的资料比较少,有一张大恒图像培训的文档中提到过,感觉描述比较准确: 里面有四种类型比较类似:uint2.int1.int2.int4. 区分起 ...

  8. 前端快速构建神器vue-cli,windows下安装并且构建前端项目

    1.nodejs官网http://nodejs.cn/下载安装包,傻瓜式安装即可 2.dos命令查询node的版本 node -v 查询版本号 npm -v 查询npm包管理版本 3.安装国内镜像 n ...

  9. BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)

    这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...

  10. 使用meshgrid生成热图和单位向量场

    需求: 生成 中heatmap unit vector field 目前的数据: 图像的shape, 关键点的x,y , heatmap的半径R 思路: 如果使用for循环来判断距离,会很慢,如果预先 ...