模板一:

时间复杂度O(n2

  1. int dijkstra(int s,int m) //s为起点,m为终点
  2. {
  3. memset(dist,,sizeof(dist)); //初始化,dist数组用来储存s到各个点的距离
  4. memset(v,,sizeof(v)); //初始化v数组,是否已标记
  5. for(int i=;i<=n;++i) //++i返回的是引用,稍微快一点
  6. {
  7. dist[i]=e[s][i]; //初始化,e[s][i]数组表示是点s到点i的权值,数组e用来存有向图或无向图的权值,用INF初始化
  8. }
  9. for(int i=;i<=n;++i)
  10. {
  11. k=INF,u=;
  12. for(int j=;j<=n;++j) //找出当前dist最小的点
  13. {
  14. if(!v[j]&&dist[j]<k)
  15. {
  16. k=dist[j];
  17. u=j;
  18. }
  19. }
  20. v[u]=; //标记
  21. for(int j=;j<=n;++j) //更新与点u相连的点的权值和
  22. {
  23. if(!v[j]&&e[u][j]<INF&&dist[u]+e[u][j]<dist[j]) //比较从点s到点u载到点j的权值和点s直接到点j的权值
  24. {
  25. dist[j]=dist[u]+e[u][j];
  26. }
  27. }
  28. }
  29. return dist[m];
  30. }

模板二:

时间复杂度 O(mlogn)m为边数,n为顶点数。

对于稀疏图的效果显著,对稠密图慎用。

  1. const int INF = 0x3f3f3f3f;
  2. const int maxn = ;
  3. struct Edge
  4. {
  5. int from, to, dist;
  6. Edge(int u, int v, int d) :from(u), to(v), dist(d) {}
  7. };
  8. struct HeapNode
  9. {
  10. int d, u;
  11. HeapNode(int D,int U):d(D),u(U){}
  12. bool operator < (const HeapNode& rhs) const {
  13. return d > rhs.d;
  14. }
  15. };
  16. struct Dijkstra
  17. {
  18. int n, m;
  19. vector<Edge> edges;
  20. vector<int> G[maxn]; //maxn要大于顶点数
  21. bool done[maxn];
  22. int d[maxn];
  23. int p[maxn];
  24.  
  25. void init(int n)
  26. {
  27. this->n = n;
  28. for (int i = ; i < n; ++i)
  29. G[i].clear();
  30. edges.clear();
  31. }
  32.  
  33. void addEdge(int from, int to, int dist)
  34. {
  35. edges.push_back(Edge(from, to, dist));
  36. m = edges.size();
  37. G[from].push_back(m - );
  38. }
  39.  
  40. void dijkstra(int s, int kk) //s为起点 kk为终点
  41. {
  42. priority_queue<HeapNode> Q;
  43. for (int i = ; i < n; ++i)
  44. d[i] = INF;
  45. d[s] = ;
  46. memset(done, , sizeof(done));
  47. Q.push(HeapNode( , s ));
  48. while (!Q.empty())
  49. {
  50. HeapNode x = Q.top();
  51. Q.pop();
  52. int u = x.u;
  53. if (u == kk) //到终点就退出
  54. {
  55. printf("%d\n", x.d);
  56. break;
  57. }
  58. if (done[u])
  59. {
  60. continue;
  61. }
  62. done[u] = true;
  63. for (int i = ; i < G[u].size(); ++i)
  64. {
  65. Edge& e = edges[G[u][i]];
  66. if (d[u] + e.dist < d[e.to])
  67. {
  68. d[e.to] = d[u] + e.dist;
  69. p[e.to] = G[u][i];
  70. Q.push(HeapNode(d[e.to], e.to ));
  71. }
  72. }
  73. }
  74. }
  75.  
  76. };

放一道模板题

http://acm.hdu.edu.cn/showproblem.php?pid=2544

AC代码

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <queue>
  7. using namespace std;
  8. const int INF = 0x3f3f3f3f;
  9. const int maxn = ;
  10. struct Edge
  11. {
  12. int from, to, dist;
  13. Edge(int u, int v, int d) :from(u), to(v), dist(d) {}
  14. };
  15. struct HeapNode
  16. {
  17. int d, u;
  18. HeapNode(int D,int U):d(D),u(U){}
  19. bool operator < (const HeapNode& rhs) const {
  20. return d > rhs.d;
  21. }
  22. };
  23. struct Dijkstra
  24. {
  25. int n, m;
  26. vector<Edge> edges;
  27. vector<int> G[maxn]; //maxn要大于顶点数
  28. bool done[maxn];
  29. int d[maxn];
  30. int p[maxn];
  31.  
  32. void init(int n)
  33. {
  34. this->n = n;
  35. for (int i = ; i < n; ++i)
  36. G[i].clear();
  37. edges.clear();
  38. }
  39.  
  40. void addEdge(int from, int to, int dist)
  41. {
  42. edges.push_back(Edge(from, to, dist));
  43. m = edges.size();
  44. G[from].push_back(m - );
  45. }
  46.  
  47. void dijkstra(int s, int kk) //s为起点 kk为终点
  48. {
  49. priority_queue<HeapNode> Q;
  50. for (int i = ; i < n; ++i)
  51. d[i] = INF;
  52. d[s] = ;
  53. memset(done, , sizeof(done));
  54. Q.push(HeapNode( , s ));
  55. while (!Q.empty())
  56. {
  57. HeapNode x = Q.top();
  58. Q.pop();
  59. int u = x.u;
  60. if (u == kk)
  61. {
  62. printf("%d\n", x.d);
  63. break;
  64. }
  65. if (done[u])
  66. {
  67. continue;
  68. }
  69. done[u] = true;
  70. for (int i = ; i < G[u].size(); ++i)
  71. {
  72. Edge& e = edges[G[u][i]];
  73. if (d[u] + e.dist < d[e.to])
  74. {
  75. d[e.to] = d[u] + e.dist;
  76. p[e.to] = G[u][i];
  77. Q.push(HeapNode(d[e.to], e.to ));
  78. }
  79. }
  80. }
  81. }
  82.  
  83. };
  84. int n, m, x, y, k;
  85. Dijkstra d;
  86. int main()
  87. {
  88. while (cin>>n>>m)
  89. {
  90. d.init(n);
  91. if (n == && m == )
  92. break;
  93. while (m--)
  94. {
  95. cin >> x >> y >> k;
  96. d.addEdge(x - , y - , k);
  97. d.addEdge(y - , x - , k);
  98. }
  99. d.dijkstra(, n - );
  100. }
  101. return ;
  102. }

持续更新……

迪杰斯特拉算法(Dijkstra)的更多相关文章

  1. 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...

  2. C# 迪杰斯特拉算法 Dijkstra

    什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...

  3. 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)

    文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...

  4. 迪杰斯特拉算法dijkstra(可打印最短路径)

    #include <iostream> #include <iomanip> #include <string> using namespace std; #def ...

  5. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  6. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  7. dijkstra算法(迪杰斯特拉算法)

    dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...

  8. 理解最短路径——迪杰斯特拉(dijkstra)算法

    原址地址:http://ibupu.link/?id=29 1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...

  9. Dijkstra【迪杰斯特拉算法】

    有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

  10. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

随机推荐

  1. [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)

    Solution: ​ 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] ​ 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...

  2. svg画圆环

    之前我已经分享了一篇css画圆环,为啥今天还要分享一篇svg画圆环呢? 原因是:css画圆环在部分ipone手机会有bug,最大张角为90°,所以圆环会有白色的间隙. 好了,开始代码展示: html: ...

  3. php ecshop采集商品添加规则

    ecshop采集商品添加规则 <?phpheader("Content-type:text/html;charset=utf-8"); function get($url) ...

  4. 阿里云云监控agent插件 - Linux版

    阿里云云监控agent插件使用指南 1.安装(注意,要以“root”权限运行,复制 sudo后面的就行,别把#也复制进去) #64位 # sudo bash -c "wget -e 'htt ...

  5. C# IEnumerable与IQueryable ,IEnumerable与IList ,LINQ理解Var和IEnumerable

    原文:https://www.cnblogs.com/WinHEC/articles/understanding-var-and-ienumerable-with-linq.html 使用LINQ从数 ...

  6. ApacheHttpServer出现启动报错:the requested operation has failed解决办法

    转自:https://www.jb51.net/article/21004.htm 原因一:80端口占用 例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突 装 ...

  7. 在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问

    在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问 问题描述:在Intellij上开发项目发布到tomcat时,同一个局域网 ...

  8. rm - 移除文件或者目录

    总览 rm [options] file... POSIX(Portable Operating System Interface 可移植的操作系统接口) 选项: [-fiRr] GNU 选项 (最短 ...

  9. 四、Angular新建组件和使用

    1.新建组件命令 ng component 组件路径 如果报错换成 ng generate component 组件路径 2.组件 ts 文件详解 3.组件会自动引入到app.mudule.ts里面 ...

  10. Git 协作:Fetch Pull Push Branch Remote Rebase Cherry-pick相关

    前言 学习git的时候,我们首先学习的是最常用的,自己独立开发Software时用的命令: git init //初始化git仓库 git add <file_name> //将文件添加到 ...