Dijkstra算法原理请见:最短路径问题(Dijkstra解法)

该算法对于稠密图更加有效:

对于给出具有非负权重的边和源顶点S的图G,算法可在O(mlogn)时间内找出从s点到其他每一个顶点的距离。

如果图是稠密的,即对于某个ε>0,m>=n^(1+ε),可以被改善在O(m/ε)内执行。(m为图的边数,n为图的定点数)

最小堆模板:

[cpp] view plaincopy
  1. struct HeapElement {
  2. // key存储顶点序号,value存储到该顶点的最短距离
  3. int key, value;
  4. };
  5. struct MinHeap {
  6. HeapElement heap[MAXN];
  7. int position[MAXN];
  8. int size; // 顶点数
  9. void init() {
  10. heap[size=0].value = -INF;
  11. memset(position, 0, sizeof(position));
  12. }
  13. void insert(int key, int value) {
  14. heap[++size].key = key;
  15. heap[size].value = value;
  16. position[key] = size;
  17. siftUp(size);
  18. }
  19. void decrease(int index) {
  20. int x = heap[index].value;
  21. int y = heap[size].value;
  22. -- size;
  23. if (index == size+1)
  24. return;
  25. swap(heap[index], heap[size+1]);
  26. if (y >= x) {
  27. siftDown(index);
  28. } else {
  29. siftUp(index);
  30. }
  31. }
  32. int delmin() {
  33. int x = heap[1].key;
  34. decrease(1);
  35. return x;
  36. }
  37. void siftUp(int index) {
  38. while (index > 1) {
  39. if (heap[index].value < heap[index/2].value) {
  40. swap(heap[index],heap[index/2]);
  41. } else {
  42. break;
  43. }
  44. index /= 2;
  45. }
  46. }
  47. void siftDown(int index) {
  48. while (index*2 <= size) {
  49. index *= 2;
  50. if (index < size && heap[index].value > heap[index+1].value) {
  51. ++ index;
  52. }
  53. if (heap[index].value < heap[index/2].value) {
  54. swap(heap[index],heap[index/2]);
  55. } else {
  56. break;
  57. }
  58. }
  59. }
  60. void makeHeap() {
  61. for (int i = size/2; i > 0; -- i)
  62. siftDown(i);
  63. }
  64. void swap(HeapElement &a, HeapElement &b) {
  65. HeapElement temp = a;
  66. a = b;
  67. b = temp;
  68. int tmp = position[a.key];
  69. position[a.key] = position[b.key];
  70. position[b.key] = tmp;
  71. }
  72. }H;

代码实现:(hdu2544)

[cpp] view plaincopy
  1. #include <iostream>
  2. #define INF 0x7FFFFFFF
  3. using namespace std;
  4. const int SIZE = 105;
  5. int dist[SIZE];
  6. int G[SIZE][SIZE];
  7. bool vis[SIZE];
  8. struct HeapElement {
  9. int key, value;
  10. };
  11. void swap(HeapElement &ha, HeapElement &hb) {
  12. int key = ha.key;
  13. int value = ha.value;
  14. ha.key = hb.key;
  15. ha.value = hb.value;
  16. hb.key = key;
  17. hb.value = value;
  18. };
  19. // 使用邻接表储存图,线性表储存堆
  20. struct MinHeap {
  21. HeapElement heap[SIZE];
  22. int n;    // 顶点数
  23. void makeheap() {
  24. for (int i = n/2; i > 0; -- i)
  25. siftDown(i);
  26. };
  27. void siftUp(int index) {
  28. int k = index;
  29. while (k > 1) {
  30. if (heap[k].value < heap[k/2].value) {
  31. swap(heap[k],heap[k/2]);
  32. } else {
  33. break;
  34. }
  35. k /= 2;
  36. }
  37. };
  38. void siftDown(int index) {
  39. int k = index;
  40. while (k*2 <= n) {
  41. k *= 2;
  42. if (k < n && heap[k].value > heap[k+1].value) {
  43. ++ k;
  44. }
  45. if (heap[k].value < heap[k/2].value) {
  46. swap(heap[k],heap[k/2]);
  47. } else {
  48. break;
  49. }
  50. }
  51. };
  52. void insert(HeapElement element) {
  53. heap[++n] = element;
  54. siftUp(n);
  55. };
  56. void decrease(int index) {
  57. int x = heap[index].value;
  58. int y = heap[n].value;
  59. n -= 1;
  60. // 若删除节点位于最末位置,则删除成功,无需其他操作。
  61. if (index == n+1)
  62. return;
  63. heap[index] = heap[n+1];
  64. if (y >= x) {
  65. siftDown(index);
  66. } else {
  67. siftUp(index);
  68. }
  69. };
  70. int decreaseMin() {
  71. int x = heap[1].key;
  72. decrease(1);
  73. return x;
  74. };
  75. }H;
  76. void dijkstra(int src, int n) {
  77. int i, j, w;
  78. bool flag;
  79. for (i = 1; i <= n; ++ i) {
  80. if (G[i][src] != INF) {
  81. dist[i] = G[src][i];
  82. HeapElement h = {i, dist[i]};
  83. H.insert(h);
  84. } else {
  85. dist[i] = INF;
  86. }
  87. }
  88. memset(vis, false, sizeof(vis));
  89. vis[src] = true;
  90. dist[src] = 0;
  91. for (i = 1; i < n; ++ i) {
  92. int node = H.decreaseMin();
  93. vis[node] = true;
  94. for (w = 1; w <= n; ++ w) {
  95. flag = false;
  96. if (!vis[w] && G[node][w] != INF) {
  97. if (dist[node] < dist[w] - G[node][w]) {
  98. dist[w] = dist[node] + G[node][w];
  99. }
  100. for (j = 1; j <= H.n; ++ j) {
  101. if (H.heap[j].key == w) {
  102. H.heap[j].value = dist[w];
  103. flag = true;
  104. break;
  105. }
  106. }
  107. if (!flag) {
  108. HeapElement h = {w, dist[w]};
  109. H.insert(h);
  110. } else {
  111. H.siftUp(j);
  112. }
  113. }
  114. }
  115. }
  116. };
  117. void init(int n) {
  118. for (int i = 1; i <= n; ++ i)
  119. for (int j = 1; j <= n; ++ j)
  120. G[i][j] = INF;
  121. H.n = 0;
  122. };
  123. int main()
  124. {
  125. int N, M, a, b, c;
  126. //freopen("C:\\Users\\Smile\\test.txt","r",stdin);
  127. //freopen("C:\\Users\\Smile\\out.txt", "w", stdout);
  128. while (scanf("%d%d",&N,&M)!=EOF, N&&M) {
  129. init(N);
  130. for (int i = 0; i < M; ++ i) {
  131. scanf("%d%d%d",&a,&b,&c);
  132. if (G[a][b] > c) {
  133. G[a][b] = c;
  134. G[b][a] = c;
  135. }
  136. }
  137. dijkstra(1, N);
  138. printf("%d\n",dist[N]);
  139. }
  140. }

Dijkstra + 堆优化相关推荐

  1. dijkstra堆优化(multiset实现-大大减小代码量)

    例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...

  2. A - Age of Moyu HDU - 6386(Dijkstra+堆优化)

    要解决这道题,可以用dfs+bfs,但是我不会,所以我只会dijkstra算法: 要解决这道题必须明白迪杰斯特拉算法的核心思想,我是这样理解的: 我可以任意举例一个图: 比如这个图,那么求1-6的最短 ...

  3. * Dijkstra 堆优化

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Mashiro_ylb/article/ ...

  4. poj1511 InvitationCards 最短路 Dijkstra堆优化

    第一反应想到和 poj3268做法一样,先是从起点dj,然后将图反向,再次dj一次,求和即可.但是,数据O(n*n)过不去,所以需要使用dijkstra的堆优化! 淦,没用scanf结果超时了= = ...

  5. 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化

    今天的集训学习了最短路dijkstra的堆优化,把时间复杂度从朴素版的O()降至了O(n*logn+m). 首先,先上一段朴素版的代码. void dijkstra() {dist[1] = 0;fo ...

  6. dijkstra+堆优化

    分析: 可知Dijkstra算法的复杂度是O(n*n) Dijkstra算法在寻找集合T中距离最小的顶点W(即寻找dist数组中最小值)复杂度是O(n),在更新距离操作时复杂度为O(n). 上述操作需 ...

  7. HDU-6290 奢侈的旅行 2018女赛 Dijkstra堆优化

    又因为cost=log2∗((level+ai)/level)cost=log2*((level+a_i)/level)cost=log2∗((level+ai​)/level),cost会带着log ...

  8. * poj 3159 Candies 最短路 dijkstra堆优化

    题意: n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 Input: 输入包含单个测试用例.测试用例以两个整数n和m开头,分别 ...

  9. HDU ACM 3986 Harry Potter and the Final Battle(邻接表实现最短路dijkstra堆优化记录路径 + 枚举最短路上每条边)...

    http://acm.hdu.edu.cn/showproblem.php?pid=3986 题意: 从起点1 到 终点n,删除图中任意一条边求最短路的最坏情况. n  --表示有n个点 m --边数 ...

  10. dijkstra算法及其堆优化

    dijkstra算法及其堆优化 (个人笔记写给自己看的) 数据结构:链式前向星,优先队列 dijkstra算法: vis数组初始化为0,dis数组初始化为inf(很大的值如:0x7fffffff),设 ...

最新文章

  1. POJ1149-PIGS
  2. Matlab学习笔记——find()函数
  3. numpy中的matrix矩阵处理
  4. (转)使用异步 I/O 大大提高应用程序的性能
  5. 【python教程入门学习】python入门:来来来,每天10点定时签到拿京豆啦
  6. 和最大子序列(dp)
  7. HIVE 的笛卡尔积on无条件
  8. paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
  9. Marked.js让您的文档编辑更加轻松自如!
  10. 为什么大数据与云计算密不可分?
  11. 「GoTeam 招聘时间」滴滴出行系统研发工程师(北京)
  12. 30系列显卡安装深度学习pytorch坏境
  13. 阅读《工业革命》有感——福(氟)到了
  14. hadoop直接解压hdfs中的zip文件
  15. 五部超燃科幻电影,九成没有全部看过
  16. 前端对浏览器性能优化
  17. java 一维码架包_Java 生成、识别条形码
  18. Linux 23年来的发展历史
  19. 【数据结构】——平衡二叉树(AVL树)
  20. 伯恩PAC人格结构理论(转载)

热门文章

  1. Zookeeper,Hbase 伪分布,集群搭建
  2. [置顶]       javascript中的数组对象以及json学习笔记
  3. python调用接口获取文件_Python中做接口自动化如何读取配置ini文件
  4. python语言程序设计编程题_《python语言程序设计》_第二章编程题
  5. mysql数据库官网怎么下载安装_MySQL数据库的下载与安装
  6. mysql 8.0安装_MySQL5.7升级到8.0过程详解
  7. 细粒度图像分类_【完结】16篇图像分类干货文章总结,从理论到实践全流程大盘点!...
  8. java 数据流 中文_【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-wi...
  9. JMETER安装中遇到的问题(not able to find Java executable or version.Please check your java installation)
  10. python爬取拉勾网职位信息_Python爬虫:拉勾网Python的职位信息爬取