图的最短路算法 Dijkstra及其优化
单源最短路径算法
时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快)
不支持有负权的图
#include<iostream> using namespace std; const int maxn=1024; const int inf=1<<30; int n,m; int d[maxn]; int v[maxn]; int G[maxn][maxn]; void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) G[i][j]=(i==j?0:inf); for(int i=2;i<=n;i++) d[i]=inf,v[i]=0; d[1]=0;//这里默认是以1作为起点的 v[1]=0; } int main() { int from,to,dist; cin>>n>>m; init(); for(int i=0;i<m;i++){ cin>>from>>to>>dist; G[from][to]=G[to][from]=dist; } for(int i=1;i<=n;i++){ int x,m=inf; for(int j=1;j<=n;j++){ if(!v[j]&&d[j]<m)//写成'<'而不是'<='必须要确保图是联通的 m=d[x=j]; } v[x]=1; for(int j=1;j<=n;j++){ if(G[x][j]<inf/*防止溢出*/&&G[x][j]+d[x]<d[j]) d[j]=G[x][j]+d[x]; } } return 0; }
优化后代码
//迪杰斯特拉算法的优化 #include<iostream> #include<vector> #include<queue> using namespace std; const int maxn=1024; const int inf=1<<30; struct Edge{ int f,t,d; }; struct Node{ int d,u; bool operator<(const Node& b)const{ return d>b.d; } }; int n,m; int d[maxn],v[maxn]; vector<int> G[maxn]; vector<Edge> edges; priority_queue<Node> Q; void init(){ for(int i=1;i<=n;i++) G[i].clear(); for(int i=1;i<=n;i++) v[i]=0; for(int i=2;i<=n;i++) d[i]=inf; d[1]=0; } int main() { int from,to,dist; cin>>n>>m; init(); for(int i=0;i<m;i++){ cin>>from>>to>>dist; edges.push_back((Edge){from,to,dist}); G[from].push_back(edges.size()-1); edges.push_back((Edge){to,from,dist}); G[to].push_back(edges.size()-1); } Q.push((Node){0,1}); while(!Q.empty()){ Node x=Q.top();Q.pop(); int u=x.u; if(v[u]) continue; v[u]=1; for(int i=0;i<G[u].size();i++){ Edge& e=edges[G[u][i]]; if(d[e.t]>d[u]+e.d){ d[e.t]=d[u]+e.d; Q.push((Node){d[e.t],e.t}); } } } return 0; }
图的最短路算法 Dijkstra及其优化的更多相关文章
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- 最短路算法 Dijkstra 入门
dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...
- 10行实现最短路算法——Dijkstra
今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
- dijkstra最短路算法(堆优化)
这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...
- 图的最短路算法 Bellman-Ford
BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...
- 单源最短路——朴素Dijkstra&堆优化版
朴素Dijkstra 是一种基于贪心的算法. 稠密图使用二维数组存储点和边,稀疏图使用邻接表存储点和边. 算法步骤: 1.将图上的初始点看作一个集合S,其它点看作另一个集合 2.根据初始点,求出其它点 ...
- 最短路算法 —— Dijkstra算法
用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2) ...
- 图的最短路算法 Floyd
多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024 ...
- 图 Graph-图的相关算法
2018-03-06 17:42:02 一.最短路问题 问题描述:在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径. 这条路径就是两点之间的最短路径 (Shortest Path ...
随机推荐
- rsync 同步文件
rsync 同步文件 rsync -avz roo@192.168.4.12::/home/a ./a --exclude "data" exclude 去掉/a/data 文件 ...
- MEF简单示例
原文地址: http://www.cnblogs.com/xiaokang088/archive/2012/02/21/2361631.html MEF 的精髓在于插件式开发,方便扩展. 例如,应用程 ...
- hive查询语句
一. 为什么hive是数据仓库 hive局限于hdfs, 不能进行记录级别的增删改 hive底层的mapreduce启动耗时很长, 无法做到传统数据库的秒查, 只适合离线分析 hive不支持事务, 无 ...
- Instant Run
http://tools.android.com/tech-docs/instant-run N Developer Preview users: Instant Run is currently i ...
- Educational Codeforces Round 15 Powers of Two
Powers of Two 题意: 让求ai+aj=2的x次幂的数有几对,且i < j. 题解: 首先要知道,排完序对答案是没有影响的,比如样例7 1一对,和1 7一对是样的,所以就可以排序之后 ...
- queue 与 vector
优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储. 例如:我们常用的操作就 ...
- Python补充01 序列的方法
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...
- oc 中随机数的用法(arc4random( ) 、random( )、CCRANDOM_0_1( )
来源:http://www.cnblogs.com/jay-dong/archive/2012/07/23/2604916.html 1).arc4random() 比较精确不需要生成随即种子 使用方 ...
- 全文检索引擎Solr系列—–全文检索基本原理
场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索方法叫做顺 ...
- gomobile 真机 log 打出的日志跟踪
go mobile 开发的应用,真机调试时,我们期望看到log包打出的日志, 这时候就需要借用 Android Device Monitor 了. 我们的 go 代码中用最简单的 log.Printl ...