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 ...
随机推荐
- ViewModel处理View相关事件的多种方式(非技术贴,仅学习总结)
众所周知,在UWP中,微软为我们提供了一种新的绑定方式:x:bind,它是基于编译时的绑定.在性能方面,运行时绑定Binding与它相比还是有些逊色的.因此针对一些确定的.不需要变更的数据,我们完全有 ...
- java反射与动态代理的理解
一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...
- blfs(systemd版本)学习笔记-编译安装sudo并创建普通用户配置sudo权限
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! blfs书中sudo的安装配置章节:http://www.linuxfromscratch.org/blfs/view/stab ...
- linux学习笔记-安装配置使用clamav杀毒软件
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装clamav 2.更新病毒库 # freshclam 如果更新不了,或者更新特别慢,可以手动下载病毒库文件,放到/var ...
- Spark jdbc postgresql数据库连接和写入操作源码解读
概述:Spark postgresql jdbc 数据库连接和写入操作源码解读,详细记录了SparkSQL对数据库的操作,通过java程序,在本地开发和运行.整体为,Spark建立数据库连接,读取数据 ...
- python练习(-)
简单的爬虫示例: import urllib.request #python2.x版本为urllib2url = 'http://www.douban.com/'webPage=urllib.requ ...
- node webpack4.6简单配置
package.json { "name": "his-web", "version": "0.0.0", " ...
- Conjob For hybris
1.Defining the Job 写conjob的逻辑:core包下当做service层(要继承AbstractJobPerformable<CronJobModel>) public ...
- Python基础知识:模块
目录 JSON模块&pickle模块 requests模块 time模块 datetime模块 logging模块 os模块 sys模块 hashlib模块 re模块.正则表达式 config ...
- java返回值是list的时候获取list的参数类型
Type[] resultArgType = null; Type resultType = method.getGenericReturnType(); if (resultType instanc ...