洛谷P3371单源最短路径Dijkstra堆优化版及优先队列杂谈
其实堆优化版极其的简单,只要知道之前的Dijkstra怎么做,那么堆优化版就完全没有问题了。
在做之前,我们要先学会优先队列,来完成堆的任务,下面盘点了几种堆的表示方式。
priority_queue< pair<int,int> >q;// 这就是本程序要用的两个量的堆,当然这是大根堆,排的是第一个
q.qush(make_pair(,));//在程序中是这么用的,大根堆排序的是0
int x=q.top().second;//取第二个元素
int x=q.top().first;//取第一个元素 priority_queue<int>q; //这就是普通的大根堆
priority_queue<int,vector<int>,less<int> >q;//也可以这么写,但有前面一个很显然不会用这个 priority_queue<int,vector<int>,greater<int> >q;//这个是小根堆,一般性我们可以用大根堆来模拟小根堆,只要把元素变成负的就可以了。
q.push(make_pair(-dis[shu[w].to],shu[w].to));//在本程序中是这样用大根堆来起到小根堆的效果的,因为我没有找到怎么定义小根堆有两个量的方式 下面是优先队列的几种操作的方式:
int x=q.top();//取堆顶元素,除了一开始讲的两个量的堆,其它都是
q.pop();//删除堆顶元素
itn x=q.size();//堆的元素个数
q.push(int);//插入一个元素,它会自己排序的
以上就是本人对优先队列的了解。(真是个蒟蒻)
下面就是堆优化版的Dijkstra。还是借助代码来讲解。嗷嗷嗷,对了链式前向星还有一个更加大众的名字,邻接表。
#include<bits/stdc++.h>
using namespace std;
struct node{
int quan,qian,to;
}shu[];
int head[],ans,n,m,s,dis[];
bool vis[];
priority_queue< pair<int,int> >q;
void add(int x,int y,int z){
shu[++ans].qian=head[x];
shu[ans].quan=z;
shu[ans].to=y;
head[x]=ans;
}//邻接表,也就是链式前向星。
void Dijkstra(){
memset(dis,0x3f,sizeof(dis));
memset(vis,false,sizeof(vis));
q.push(make_pair(,s));//存入编号,前面的0没有影响,因为一开始就被删掉,你可以想设什么设什么
dis[s]=;
while (q.size()!=){//如果堆中还有元素,也就是size不为0
int x=q.top().second;q.pop();//取编号,删掉堆顶
if (vis[x]) continue;//如果已经被找过那么就可以跳过了
vis[x]=true;//标记为已经找过
int w=head[x];//找到编号相对应的最后一条边
while (w!=){//边界,把所有相关的边遍历一遍
if (shu[w].quan+dis[x]<dis[shu[w].to]){//更新距离
dis[shu[w].to]=shu[w].quan+dis[x];
q.push(make_pair(-dis[shu[w].to],shu[w].to));//用负数实现小根堆的操作,存入编号
}
w=shu[w].qian;//遍历前面一条边
}
}
}
int main(){
cin>>n>>m>>s;
ans=;
for (int i=;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);//存边
}
Dijkstra();
for (int i=;i<=n;i++){
if (dis[i]>='') cout<<"2147483647 ";//如果数太大那么就没有路径可以相连
else cout<<dis[i]<<" ";
}
}
洛谷P3371单源最短路径Dijkstra堆优化版及优先队列杂谈的更多相关文章
- 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)
首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...
- 洛谷P3371单源最短路径SPFA算法
SPFA同样是一种基于贪心的算法,看过之前一篇blog的读者应该可以发现,SPFA和堆优化版的Dijkstra如此的相似,没错,但SPFA有一优点是Dijkstra没有的,就是它可以处理负边的情况. ...
- luogu3371 【模板】单源最短路径 dijkstra堆优化
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> ...
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 洛谷 P4779 单源最短路径(标准版) 题解
题面 这道题就是标准的堆优化dijkstra: 注意堆优化的dijkstra在出队时判断vis,而不是在更新时判断vis #include <bits/stdc++.h> using na ...
- SPFA板子 (背景:Luogu P3371 单源最短路径)
Luogu P3371 单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数 ...
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)
单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...
- 单源最短路径——dijkstra算法
dijkstra算法与prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...
随机推荐
- spark shell start
spark-shell \--master yarn \--deploy-mode client \--queue default \--driver-memory 1G \--executor-me ...
- rancher中级(二)(rancher中添加证书及操作虚拟主机)
制作一个ssl证书 首先了解关于ssl证书的背景知识:http://www.cnblogs.com/zxj015/p/4458066.html SSL证书包括: 1,CA证书,也叫根证书或者中间级证书 ...
- Spring 学习(三)AOP
(1)AOP概述 - AOP:面向切面编程,扩展功能不修改源代码实现 - AOP采取横向抽取机制,取代了传统的纵向继承体系重复性代码 (2)AOP底层原理 原始方法------->纵向继承体系 ...
- 牛客网Java刷题知识点之基本类型、引用类型
不多说,直接上干货! byte-short-int-long,方便识记.
- 这个五月,我拿到了腾讯暑期offer
前情回顾 本来学校就是双非,如果再没有些亮点,是很难进大厂的. 我比较幸运,曾在网易实习过一段时间,很感谢这段经历,让我有幸通过腾讯HR们的简历筛选. 对于腾讯春招,其实我是没有参加网申(2.28-3 ...
- FTP连接报530 User 用户名 cannot log in home directory inaccessible的解决方法
在server 2003新建ftp用户并开启IIS的Ftp功能之后,有时在连接这个ftp的时候会出现530 User 用户名 cannot log in home directory inaccess ...
- SpringBoot | 第二十六章:邮件发送
前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...
- SpringBoot | 第五章:多环境配置
前言 写上一篇看英文资料,耗费了心力呀,这章,相对来说简单点.也比较熟悉,但是这很实用.不扯了,开始~ 多环境配置 maven的多环境配置 springboot多环境配置 总结 老生常谈 多环境配置 ...
- Xcode警告忽略
Xcode中 cmd+B 之后总会出现各种各样的警告,对于一个对代码有洁癖的人,这种情况很难忍,接下来我们用些特殊手段强制消除这些警告 一.忽略源文件中的警告 使用编译器宏来操作 #pragma c ...
- pscp no such file or directory
背景:在WINDOWS10 上传一个文件 到 Centos 7中 工具:pscp 用法: pscp.exe -C e:\tinyfox\site\wwwroot\cdms\projecttemplat ...