单源最短路径算法

时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快)

不支持有负权的图

  1. #include<iostream>
  2. using namespace std;
  3. const int maxn=1024;
  4. const int inf=1<<30;
  5. int n,m;
  6. int d[maxn];
  7. int v[maxn];
  8. int G[maxn][maxn];
  9. void init()
  10. {
  11. for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) G[i][j]=(i==j?0:inf);
  12. for(int i=2;i<=n;i++) d[i]=inf,v[i]=0;
  13. d[1]=0;//这里默认是以1作为起点的
  14. v[1]=0;
  15. }
  16. int main()
  17. {
  18. int from,to,dist;
  19. cin>>n>>m;
  20. init();
  21. for(int i=0;i<m;i++){
  22. cin>>from>>to>>dist;
  23. G[from][to]=G[to][from]=dist;
  24. }
  25. for(int i=1;i<=n;i++){
  26. int x,m=inf;
  27. for(int j=1;j<=n;j++){
  28. if(!v[j]&&d[j]<m)//写成'<'而不是'<='必须要确保图是联通的
  29. m=d[x=j];
  30. }
  31. v[x]=1;
  32. for(int j=1;j<=n;j++){
  33. if(G[x][j]<inf/*防止溢出*/&&G[x][j]+d[x]<d[j])
  34. d[j]=G[x][j]+d[x];
  35. }
  36. }
  37. return 0;
  38. }

  优化后代码

  1. //迪杰斯特拉算法的优化
  2. #include<iostream>
  3. #include<vector>
  4. #include<queue>
  5. using namespace std;
  6. const int maxn=1024;
  7. const int inf=1<<30;
  8. struct Edge{
  9. int f,t,d;
  10. };
  11. struct Node{
  12. int d,u;
  13. bool operator<(const Node& b)const{
  14. return d>b.d;
  15. }
  16. };
  17. int n,m;
  18. int d[maxn],v[maxn];
  19. vector<int> G[maxn];
  20. vector<Edge> edges;
  21. priority_queue<Node> Q;
  22. void init(){
  23. for(int i=1;i<=n;i++) G[i].clear();
  24. for(int i=1;i<=n;i++) v[i]=0;
  25. for(int i=2;i<=n;i++) d[i]=inf;
  26. d[1]=0;
  27. }
  28. int main()
  29. {
  30. int from,to,dist;
  31. cin>>n>>m;
  32. init();
  33. for(int i=0;i<m;i++){
  34. cin>>from>>to>>dist;
  35. edges.push_back((Edge){from,to,dist});
  36. G[from].push_back(edges.size()-1);
  37. edges.push_back((Edge){to,from,dist});
  38. G[to].push_back(edges.size()-1);
  39. }
  40. Q.push((Node){0,1});
  41. while(!Q.empty()){
  42. Node x=Q.top();Q.pop();
  43. int u=x.u;
  44. if(v[u]) continue;
  45. v[u]=1;
  46. for(int i=0;i<G[u].size();i++){
  47. Edge& e=edges[G[u][i]];
  48. if(d[e.t]>d[u]+e.d){
  49. d[e.t]=d[u]+e.d;
  50. Q.push((Node){d[e.t],e.t});
  51. }
  52. }
  53. }
  54. return 0;
  55. }

  

图的最短路算法 Dijkstra及其优化的更多相关文章

  1. (转)最短路算法--Dijkstra算法

    转自:http://blog.51cto.com/ahalei/1387799         上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...

  2. 最短路算法 Dijkstra 入门

    dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路. 给你这样的一个图,需要求出1号点到其他点的最短距离是多少. 首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点 ...

  3. 10行实现最短路算法——Dijkstra

    今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...

  4. dijkstra最短路算法(堆优化)

    这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...

  5. 图的最短路算法 Bellman-Ford

    BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...

  6. 单源最短路——朴素Dijkstra&堆优化版

    朴素Dijkstra 是一种基于贪心的算法. 稠密图使用二维数组存储点和边,稀疏图使用邻接表存储点和边. 算法步骤: 1.将图上的初始点看作一个集合S,其它点看作另一个集合 2.根据初始点,求出其它点 ...

  7. 最短路算法 —— Dijkstra算法

    用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2) ...

  8. 图的最短路算法 Floyd

    多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024 ...

  9. 图 Graph-图的相关算法

    2018-03-06 17:42:02 一.最短路问题 问题描述:在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径. 这条路径就是两点之间的最短路径 (Shortest Path ...

随机推荐

  1. [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析

    转自:http://blog.csdn.net/wh_19910525/article/details/11536279 自旋锁的初衷:在短期间内进行轻量级的锁定.一个被争用的自旋锁使得请求它的线程在 ...

  2. (三)java的数据类型

    java是一种强类型的语言,所谓强类型,意味着每个变量都要有确定的类型,每个表达式也要有明确的类型,包括传递的某些参数.java中从大的方面分有两大数据类型,分别是基本数据类型和引用数据类型,基本数据 ...

  3. 返回顶部(解决IE6固定定位)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. postgresql plpythonu例子

    以下代码仅作为参考之用 select md5, crc32, record->'UserModerAnalysis'->'base_info'->'file_malware' as ...

  5. memcache 内部原理实现

    Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ...

  6. nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

    启动nginx时报这个错 , 要么用root用户启动 , 要么在配置文件nginx.conf中将server下的listen端口改掉 , 因为在linux中端口号小于1024都是需要root权限的

  7. 使用Topshelf 5步创建Windows 服务 z

    使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with T ...

  8. ruby关于flip-flop理解上一个注意点

    (..).each do |x| puts x ) .. (x == ) end 上面的flip-flop的用法,你可以理解成 将 大于等于5和小于等于10的数字打印出来,也就是理解成  puts x ...

  9. 创建指定日期java Date对象

    import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import ...

  10. Failed to create the java virtual machine完全解决办法

    一直用EcliPSe开发java,突然有这么一天,无法启动了,splash窗口显示“Failed to create the Java Virtual Machine”,结果发现eclipse和mye ...