图的最短路算法 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 ...
随机推荐
- [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
转自:http://blog.csdn.net/wh_19910525/article/details/11536279 自旋锁的初衷:在短期间内进行轻量级的锁定.一个被争用的自旋锁使得请求它的线程在 ...
- (三)java的数据类型
java是一种强类型的语言,所谓强类型,意味着每个变量都要有确定的类型,每个表达式也要有明确的类型,包括传递的某些参数.java中从大的方面分有两大数据类型,分别是基本数据类型和引用数据类型,基本数据 ...
- 返回顶部(解决IE6固定定位)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- postgresql plpythonu例子
以下代码仅作为参考之用 select md5, crc32, record->'UserModerAnalysis'->'base_info'->'file_malware' as ...
- memcache 内部原理实现
Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ...
- nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
启动nginx时报这个错 , 要么用root用户启动 , 要么在配置文件nginx.conf中将server下的listen端口改掉 , 因为在linux中端口号小于1024都是需要root权限的
- 使用Topshelf 5步创建Windows 服务 z
使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with T ...
- ruby关于flip-flop理解上一个注意点
(..).each do |x| puts x ) .. (x == ) end 上面的flip-flop的用法,你可以理解成 将 大于等于5和小于等于10的数字打印出来,也就是理解成 puts x ...
- 创建指定日期java Date对象
import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import ...
- Failed to create the java virtual machine完全解决办法
一直用EcliPSe开发java,突然有这么一天,无法启动了,splash窗口显示“Failed to create the Java Virtual Machine”,结果发现eclipse和mye ...