Luogu P4779 【模板】单源最短路径(标准版)(Dijkstra+堆优化模板)
dij其实和prim挺像的,prim是找权值最小点,dij是找边,
用一个优先队列就可以在加入边的时候直接排序,避免了每次遍历更新min
priority_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
这句话就能把大根堆转化为小根堆(pair中的第一个值first最小的在最上面),
同时pair<边权,序号>便于在对边权排序的同时调用这条边的序号。
注意事项:
- 找点的时候要有一个vis标记是否访问过(剪枝)
- 加边的时候要注意是有向图还是无向图...
代码如下
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std; const int maxn = ;
const int INF = ;
int n,m,s,x,y,z,cnt;
int to[maxn],next[maxn],head[maxn],val[maxn],dis[maxn];
bool vis[maxn]; void add(int x,int y,int z) {
to[++cnt] = y;
next[cnt] = head[x];
head[x] = cnt;
val[cnt] = z;
} void dijkstra(int s) {
priority_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
dis[s] = ;
q.push(make_pair(,s));
while(!q.empty()) {
int u = q.top().second;
q.pop();
if(vis[u])continue;
vis[u] = ;
for(int i = head[u]; i; i = next[i]) {
int v = to[i];
if(dis[v] <= dis[u] + val[i]) continue;
dis[v] = dis[u] + val[i];
q.push(make_pair(dis[v],v));
}
}
return;
} int main() {
scanf("%d%d%d",&n,&m,&s);
for(int i = ; i <= m; i++) {
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for(int i = ; i <= n; i++)
dis[i] = INF;
dijkstra(s);
for(int i = ; i <= n; i++)
cout << dis[i] << ' ';
return ;
}
Luogu P4779 【模板】单源最短路径(标准版)(Dijkstra+堆优化模板)的更多相关文章
- 单源最短路——朴素Dijkstra&堆优化版
朴素Dijkstra 是一种基于贪心的算法. 稠密图使用二维数组存储点和边,稀疏图使用邻接表存储点和边. 算法步骤: 1.将图上的初始点看作一个集合S,其它点看作另一个集合 2.根据初始点,求出其它点 ...
- 单源最短路径问题2 (Dijkstra算法)
用邻接矩阵 /* 单源最短路径问题2 (Dijkstra算法) 样例: 5 7 0 1 3 0 3 7 1 2 4 1 3 2 2 3 5 2 4 6 3 4 4 输出: [0, 3, 7, 5, 9 ...
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 单源最短路径问题之dijkstra算法
欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 算法的原理 以源点开始,以源点相连的顶点作为向外延伸的顶点,在所有这些向外延伸的顶 ...
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...
- 单源最短路径 Bellman_ford 和 dijkstra
首先两个算法都是常用于 求单源最短路径 关键部分就在于松弛操作 实际上就是dp的感觉 if (dist[e.to] > dist[v] + e.cost) { dist[e.to] = dist ...
- 非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...
- [模板]单源最短路径(Dijkstra)
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...
- 【洛谷 p3371】模板-单源最短路径(图论)
题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...
随机推荐
- 读 《CSharp Coding Guidelines》有感
目录 基本原则 类设计指南 属性成员设计指南 其他设计指南 可维护性指南 命名指南 性能指南 框架指南 文档指南 布局指南 相关链接 C# 编程指南 前不久在 Github 上看见了一位大牛创建一个仓 ...
- JavaScript异步和单线程
一,同步和异步的区别: 同步会阻塞代码执行,而异步不会.(比如alert是同步,setTimeout是异步) 二,前端使用异步的场景: 1,定时任务:setTimeout,setInterval 2, ...
- ssms2014和ssms2016版本错误定位的区别
偶尔对比起2016以下的版本(比如ssms2014),ssms2016有一个小地方有区别.就是报错的行号有区别 举个例子,下面同样的语句在ssms2014和ssms2016里面运行.就是如下的效果 C ...
- loadrunner 脚本优化-加密与解密
脚本优化-加密与解密 by:授客 QQ:1033553122 密码加密 可以给密码加密,意在把结果字符串作为脚本的参数或者参数值.例如,完整可能有一个用户密码填写的表单,你想测试网站针对不同密码的 ...
- sql server 转置 和实现随机分配和一串代码的含义拼在一行
1.sql server 转置很容易搜到方法,一般需要手动写转置的列项,如果多时会比较烦,下面试了省事的方法: --案例需求数据 ----方法一:if object_id('tempdb.dbo.#s ...
- LInux下(centos7.2)更新 python3.7
进入超级管理员目录 su root 下载 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 找到下载的文件解压 tar - ...
- 如何快速搭建&配置本地服务器-前端技能
废话不多说,上图: 首先登录http://www.phpstudy.net/download.html 下载安装phpstudy,特别简单不详解: 创建一个本机项目并且与本机域名进行绑定主要分为两步; ...
- 错误: 无法访问InstrumentationTestRunner 找不到android.test.InstrumentationTestRunner的类文件
错误: 无法访问InstrumentationTestRunner找不到android.test.InstrumentationTestRunner的类文件
- java用星星符号打印出一个直角三角形
package debug; public class Demo10 { public static void main(String[] args) { //用星星符号打印出一个直角三角形 for( ...
- P1056 排座椅
非原创 #include<bits/stdc++.h>using namespace std;int t1[2009];int t2[2009]; int findmax(int *a){ ...