Dijkstra算法堆优化
转自 https://blog.csdn.net/qq_41754350/article/details/83210517
再求单源最短路径时,算法有优劣之分,个人认为在时间方面 朴素dijkstra>bellmanford>SPFA>dijkstra+heap,所以掌握dijkstra堆优化对于OIER是必要的。
本文主要解说迪杰斯特拉堆优化的板子以及它所用到的知识;dijkstra算法、快读、stl以及链式前向星请自行百度或者看我的其他文章。
代码如下,注释个人觉得已经很清楚了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int cnt=0;//边的序号
int dis[5000010],vis[5000010],h[5000010];//dis:起点到该点的长度 vis:是否访问过了 h:起点为h[?]的暂存平台
struct node//next:下一个连接某个点的下一条边 to:该边指向的下一条边 val:边权
{
int next,to,val;
//int from; from在链式前向星的遍历里意义不大
}edg[5000010];
struct heapnode//重载小根堆
{
int num,dist;//num:标号 dist:距离
bool operator<(heapnode t) const//记住这种特殊写法就可以了
{
return dist>t.dist;//与sort相反,此处为从小到大
}
};
priority_queue<heapnode>q;//定义一个heapnode形式的优先队列q
int cread()//快读
{
int f=1,x=0;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void add(int u,int v,int val)
{
++cnt;//一条新边
edg[cnt].to=v;//记录到哪里
edg[cnt].val=val;//记录边权
edg[cnt].next=h[u];//链式前向星的菊花搜图法
h[u]=cnt;//暂存桌面
}
int main()
{
int n,m,s;//n:点数 m:边数 s:起点
n=cread();m=cread();s=cread();
int x,y,z;
for(int i=1;i<=m;i++)
{
x=cread();y=cread();z=cread();
add(x,y,z);
}
for(int i=1;i<=n;i++)dis[i]=0x7fffffff;//初始化极大值需要用for,memset会出错
memset(vis,0,sizeof(vis));//初始化访问标记
dis[s]=0;//起点到起点自然为0
heapnode tem;//定义一个跑腿tem
tem.dist=0;tem.num=s;//记录起点信息
q.push(tem);//跑腿记录的东西入队
while(!q.empty())//队不空
{
heapnode u=q.top();//使用u记录队首信息(最小值)
q.pop();//队首gg
if(vis[u.num])continue;//假如已经访问过了,跳过
vis[u.num]=1;//标记访问过了
for(int i=h[u.num];i!=0;i=edg[i].next)//链式前向星式菊花搜图
{
int v=edg[i].to;//记录某条边的到达处
if(!vis[v]&&(dis[v]>dis[u.num]+edg[i].val))//假如说v没被访问过并且原来到v的路程大于从这条边经过的到v路程
{
dis[v]=dis[u.num]+edg[i].val;//更新到v的路程
tem.num=v;tem.dist=dis[v];//跑腿记录v的信息
q.push(tem);//跑腿入队
}
}
}
for(int i=1;i<=n;i++) printf("%d ",dis[i]);//到每个点的距离输出
return 0;
}
Dijkstra算法堆优化的更多相关文章
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- Dijkstra算法堆优化详解
DIJ算法的堆优化 DIJ算法的时间复杂度是\(O(n^2)\)的,在一些题目中,这个复杂度显然不满足要求.所以我们需要继续探讨DIJ算法的优化方式. 堆优化的原理 堆优化,顾名思义,就是用堆进行优化 ...
- 最短路-朴素版Dijkstra算法&堆优化版的Dijkstra
朴素版Dijkstra 目标 找到从一个点到其他点的最短距离 思路 ①初始化距离dist数组,将起点dist距离设为0,其他点的距离设为无穷(就是很大的值) ②for循环遍历n次,每层循环里找出不在S ...
- Dijkstra算法堆优化(vector建图)
#include<iostream> #include<algorithm> #include<string.h> #include<stdio.h> ...
- 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...
- 最短路径-迪杰斯特拉(dijkstra)算法及优化详解
简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...
- Dijkstra和堆优化
Dijkstra算法 由于我之前一直记的迪杰斯特拉的翻译导致我把dijkstra写成了dijstra--所以下文#define dijstra dijkstra 我以后叫她迪杰克斯歘! Dijskra ...
- Dijkstra及其堆优化
朴素Dijkstra #include<bits/stdc++.h> using namespace std; const int inf=9999999; bool book[105]; ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
随机推荐
- Win10《芒果TV》更新v3.8.40青春版:优化推送策略、新增缓存清理
芒果TV暑期重磅活动-青春芒果节拉开帷幕,炫酷的3D视觉大秀.王牌IP互动体验馆.众星云集的青春炙燥夜晚会.神秘的芒果吉祥物发布,Win10版<芒果TV>全平台同步更新青春版v3.8.40 ...
- ASP.NET获取客户端、服务器端基础信息
1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostN ...
- 在Delphi中编辑res文件
先用记事本编写一个rc的文件.如内容为:_Comms RCData Comms.jpg Comms.jpg为图片名称,然后在这个rc文件和图片拷贝到delphi安装路径的bin文件夹里面,选中这两个文 ...
- Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)
经历了多次延期后,在3月16号,Qt发布了5.6.0版本(全面支持高DPI无疑是一个亮点),从5.6.0版本开始,Qt直接移除了webkit模块,让webengine作为其替代选择,不过webengi ...
- 编译Qt5.0连接MySql5.5数据库的驱动(5.0版本的编译,我记得5.2开始自带了)
第一步 1.准备好Mysql数据库安装文件,Qt5.0完整的离线安装包,以及Qt5.0的完整的源代码.安装好程序,假设Mysql的安装路径为:C:\MySQL5.5,Qt5.0的安装路径:C:\Qt\ ...
- Android WebView设置背景透明
Adndroid 2.x的设置 在Android 2.x下,设置webview背景为透明的方法: wvContent.setBackgroundColor(0); Adndroid 4.0 由于硬件加 ...
- 升级vue全家桶过程记录
背景 如果你使用了element-ui的el-tabs组件,并且想要单独升级element-ui至2.10.0,你会发现,使用了el-tabs组件的页面只要打开就卡死.原因是element-ui~2. ...
- Spring Boot:实现MyBatis分页
综合概述 想必大家都有过这样的体验,在使用Mybatis时,最头痛的就是写分页了,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真的不想花双倍 ...
- mpvue 试水的一天
小程序经过了将近两年的锤炼,现在出现了许许多多的框架,来帮助我们进行快速开发,最近可能迷上了mpvue这个框架,所以就用公司的项目练练手. mpvue是用vue作为基础骨架的,所以他非常想vue,所以 ...
- 5分钟学会Java9-Java11的七大新特性
现在Java有多元化的发展趋势,既有JS又有C++还有C#的影子,不学习那是不行滴. 来来来,花5分钟看看Java9-Java11的七大新特性,还有代码样例. Java11 发布了,然而很多公司还在用 ...