【模板】dijkstra
洛谷 4779
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #define N 100010
- #define rg register
- using namespace std;
- int n,m,s,tot,last[N],dis[N];
- struct edge{int to,pre,dis;}e[];
- struct node{
- int poi,dis;
- bool operator <(const node& rhs)const {return dis>rhs.dis;}
- };
- priority_queue<node>q;
- inline int read(){
- int k=,f=; char c=getchar();
- while(c<''||c>'')c=='-'&&(f=-),c=getchar();
- while(''<=c&&c<='')k=k*+c-'',c=getchar();
- return k*f;
- }
- inline void dijkstra(int x){
- for(rg int i=;i<=n;i++) dis[i]=1e9+;
- q.push((node){x,dis[x]=});
- while(!q.empty()){
- node tmp=q.top(); q.pop();
- int now=tmp.poi;
- if(dis[now]!=tmp.dis) continue;
- for(rg int i=last[now],to;i;i=e[i].pre)if(dis[to=e[i].to]>dis[now]+e[i].dis){
- dis[to]=dis[now]+e[i].dis;
- q.push((node){to,dis[to]});
- }
- }
- }
- int main(){
- n=read(); m=read(); s=read();
- for(rg int i=;i<=m;i++){
- int u=read(),v=read();
- e[++tot]=(edge){v,last[u],read()}; last[u]=tot;
- }
- dijkstra(s);
- for(rg int i=;i<=n;i++) printf("%d ",dis[i]);
- return ;
- }
手写堆的版本
- #include<cstdio>
- #include<algorithm>
- #define N 100010
- #define rg register
- #define LL long long
- using namespace std;
- int n,m,s,tot,fa,son,last[N],pos[N],dis[N];
- struct edge{int to,pre,dis;}e[];
- struct heap{int poi,dis;}h[N];
- inline int read(){
- int k=,f=; char c=getchar();
- while(c<''||c>'')c=='-'&&(f=-),c=getchar();
- while(''<=c&&c<='')k=k*+c-'',c=getchar();
- return k*f;
- }
- inline void up(int x){
- while((fa=x>>)&&h[fa].dis>h[x].dis)
- swap(h[x],h[fa]),swap(pos[h[x].poi],pos[h[fa].poi]),x=fa;
- }
- inline void down(int x){
- while((son=x<<)<=tot){
- if(h[son].dis>h[son+].dis&&son<tot) son++;
- if(h[son].dis<h[x].dis) swap(h[son],h[x]),swap(pos[h[son].poi],pos[h[x].poi]),x=son;
- else return;
- }
- }
- inline void dijkstra(int x){
- for(rg int i=;i<=n;i++) dis[i]=1e9+;
- h[pos[x]=tot=]=(heap){x,dis[x]=};
- while(tot){
- int now=h[].poi; pos[h[tot].poi]=; h[]=h[tot--]; if(tot) down();
- for(rg int i=last[now],to;i;i=e[i].pre)if(dis[to=e[i].to]>dis[now]+e[i].dis){
- dis[to]=dis[now]+e[i].dis;
- if(!pos[to]) h[pos[to]=++tot]=(heap){to,dis[to]};
- else h[pos[to]].dis=dis[to];
- up(pos[to]);
- }
- }
- }
- int main(){
- n=read(); m=read(); s=read();
- for(rg int i=;i<=m;i++){
- int u=read(),v=read();
- e[++tot]=(edge){v,last[u],read()}; last[u]=tot;
- }
- dijkstra(s);
- for(rg int i=;i<=n;i++) printf("%d ",dis[i]);
- return ;
- }
【模板】dijkstra的更多相关文章
- 基础最短路(模板 dijkstra)
Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...
- 模板 Dijkstra+链式前向星+堆优化(非原创)
我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...
- [模板] dijkstra (堆优化)
复杂度O(mlogn) 输入起点s,可以得到从起点到各点的最短路距离数组dis[i] 过程: 1.初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点 2.搜索:取出队 ...
- POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
题目连接: http://poj.org/problem?id=2387 Description Bessie is out in the field and wants to get back to ...
- Dijkstra和Prim算法的区别
Dijkstra和Prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的点集合A ...
- [笔记-图论]Dijkstra
用于求正权有向图 上的 单源最短路 优化后时间复杂度O(mlogn) 模板 // Dijkstra // to get the minumum distance with no negtive way ...
- CSP-S需备模板大全
CSP-S需备模板大全 谨以此文祝愿自己\(CSP-S\,\,2019\,\,\color{red}{RP++!!}\) 算法 二分 while(l<r) { int mid=(l+r+1)&g ...
- ACM模板合集
写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- Dijkstra 模板 最短路
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents ------------------------------------------ ...
随机推荐
- 批量ssh执行命令
[root@openfire1 script]# cat test.sh #!/bin/bash #本地通过ssh执行远程服务器的脚本 for ip in `cat iplist` do ...
- ubuntu多版本jdk安装及切换
系统:ubuntu14.04 一.安装openjdk1.7 sudo apt-get install openjdk-7-jre openjdk-7-jdk 安装完成后找到其安装路径: dpkg -L ...
- B2761 [JLOI2011]不重复数字 离散化
就是一道离散化的裸题,但是在写的时候遇到了一些不可描述的问题,但是还是很顺利的. 题干: Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 ,其中2 ...
- js和php中几种生成验证码的方式
之前做过取随机数和生成验证码的练习,都是通过取随机数作为数组下标,然后从数组中取值的方式(js): /*验证码*/ function sj_yzm(){ //存一个包括数字和字母的数组 var zon ...
- 用JavaScript实现歌词滚动播放
各种音乐播放器上都有一个自动滚动播放歌词的功能,那么这个功能用JavaScript怎么实现呢?请看下文. 一般音乐播放器使用的歌词格式都是lrc,为了方便处理,我们这里使用XML格式的歌词.介绍一个网 ...
- 原生方式实现Ajax技术
一:什么是Ajax? Ajax:异步的JavaScript和XML,用于完成网页局部刷新功能(修改少量数据只用局部刷新,不用再整个网页重新加载): XML的作用:1.是用于数据传输,但现在都在使用JS ...
- xfs文件备份恢复篇一vm中linux新增磁盘
XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据.xfsdump 按inode顺序备份一个XFS文件系统.centos7选择xfs格式作为默认文件系统,而且不 ...
- go 学习成长之路
一.go的搭建 二.初识go 三.混个脸熟--go 四.go的语言结构 五.go的常量与变量 六.go基础数据类型 七.go 条件语句 八.go 运算符 九.go条件语句switch 十.go循环语句 ...
- 【洛谷4158/BZOJ1296】[SCOI2009]粉刷匠(动态规划)
题目:洛谷4158 分析: 这题一看就是动态规划. 可以看出,如果每个木条粉刷的次数是固定的,那么这些木条是互不干扰的,因此对于每个木条可以通过dp来求出把T次中的j次分配给这个木条时可以获得的最大正 ...
- Coursera公开课-Machine_learing:编程作业4
编程作业: Neural Network Learning 源码上传到gitlab. 对于神经网络的理解也都在源码注释里面了,感兴趣可以看看.