图的最短路算法 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 ...
随机推荐
- android的m、mm、mmm编译命令
android的m.mm.mmm编译命令的使用 android源码目录下的build/envsetup.sh文件,描述编译的命令 - m: Makes from the top of th ...
- Java的clone机制(及String的特殊性)
1. Clone&Copy 假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000),通常我们会有这样的赋值Employee ...
- PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
2014-09-25 Created By BaoXinjian
- IGS_学习笔记07_IREP通过页面测试客户化Web Service调用(案例)
20150819 Created By BaoXinjian
- PLSQL_Oracle簇表和簇表管理Index clustered tables(案例)
2012-06-08 Created By BaoXinjian
- [实变函数]2.1 度量空间 (metric space), $n$ 维 Euclidean 空间
1 回忆: $$\bex \lim_{n\to\infty}a_n=a\lra \forall\ \ve>0,\ \exists\ N,\ \forall\ n\geq N,\mbo ...
- Mac 上SVN上传.a文件
SVN默认是忽略.a文件,所以修改配置文件去掉忽略配置行的 *.a 通过终端打开配置文件: open ~/.subversion/config 把下面两行(也可能是一行)中的注释和*.a去掉, #gl ...
- IceGrid负载均衡部署 z
[IceGrid负载均衡部署步骤]1.环境主机1:IP=192.168.0.239,上面部署注册表服务器registry和节点node1,registry和node1运行在同一进程中:主机2:IP=1 ...
- DXperience-11.1.5 破解
将DXPerience_11.1.5_Crack里的所有文件粘贴到DXperience-11.1.5的bin文件夹下,然后在cmd运行register.bin
- SQLServer 2008以上误操作数据库恢复方法——日志尾部备份(转)
问题: 经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了.人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题. 遇到这 ...