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 ...
随机推荐
- python学习之老男孩python全栈第九期_day001作业
1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while count <= 9: count += 1 if count == 7:continu ...
- vue自制switch滑块
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- sql server:Monty Hall problem (蒙提霍尔问题)
--------------------------------------------------------------------- -- Auxiliry Table of Numbers 数 ...
- Source Insight里头文件注释和函数头的注释
1.将下述代码拷贝入一个文件,扩展名为em 2.打开BASE工程,添加本文件,并重新同步 3.添加hh_InsertFuncHeader的快捷键,即为函数头注释,光标需要放在函数名那一行,否则无效 4 ...
- 使用linq语句进行联表查询
假设你有一个父表(例如:汽车),其关联一个子表,例如轮子(一对多).现在你想对于所有的父表汽车,遍历所有汽车,然后打印出来所有轮子的信息.默认的做法将是: SELECT CarId FROM Cars ...
- android ninja【转】
Android7.0 Ninja编译原理 引言 使在Android N的系统上,初次使用了Ninja的编译系统.对于Ninja,最初的印象是用在了Chromium open source code的编 ...
- windows10不能获取有效IP的问题
最近我的windows10系统一直不能有效获取IP地址(无论有线还是无线),但手工设置IP后又能正常上网,所以怀疑是某个服务未启动的原因. 查了一下百度,发现还真是,现将解决方案记录如下: 1.打开系 ...
- sql server2014企业版无人值守批处理脚本自动化安装
▲版权声明:本文为博主原创文章,未经博主允许不得转载. SQL Server系列软件是Microsoft 公司推出的关系型数据库管理系统.2014年4月16日于旧金山召开的一场发布会上,微软CEO萨蒂 ...
- domain or business logic
Here are a few of the questions you should ask when writing business logic: ¡Do you fully understand ...
- php报错 【 Call to undefined function imagecreatetruecolor()】
刚才在写验证码的时候,发现报错,然后排查分析了一下,原来是所用的php版本(PHP/5.3.13)没有开启此扩展功能. 进入php.ini 找到extension=php_gd2.dll ,将其前面的 ...