参考

此题Dijkstra算法,一次AC。这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科):

附上:  迪科斯彻算法分解(优酷)

problem link -> HDU
1874

  1. // HDU 1874 畅通工程续 -- 单源点最短路问题
  2. // 邻接矩阵 + Dijkstra
  3. // N 个村庄如果连通
  4. // 最少拥有 N-1 条道路, 最多拥有 N(N-1)/2条道路
  5. // 前提是任何两个村庄之间最多一条直达通道,但这个题目却有重复输入
  6. /* test data
  7. 12 14
  8. 1 3 1
  9. 5 1 4
  10. 5 8 3
  11. 8 2 6
  12. 8 4 3
  13. 5 4 1
  14. 3 9 5
  15. 9 10 2
  16. 9 7 7
  17. 6 3 4
  18. 6 4 4
  19. 4 7 5
  20. 10 7 3
  21. 5 6 2
  22. 1 4
  23. =5
  24. 3 3
  25. 0 1 1
  26. 0 2 3
  27. 1 2 1
  28. 0 2
  29. =2
  30. 3 1
  31. 0 1 1
  32. 1 2
  33. =-1
  34. */
  35. #include <cstdio>
  36. #include <iostream>
  37. #include <algorithm>
  38. using namespace std;
  39.  
  40. const int infinite = (1<<30); // 定义正无穷大(不能定义为((1<<31)-1)因为再相加会溢出) (~正无穷大 == 负无穷大)
  41. const int MAXV = 101; // 村庄最多的个数
  42. int via[MAXV][MAXV]; // 邻接矩阵
  43. int n_villages,n_vias;
  44. int d[MAXV]; // 源点S 距 点Pi的距离=d[i]
  45. bool flag[MAXV]; // 标记不找回头路
  46.  
  47. int Dijkstra(int s,int e,int n){ // 最终结果 即最短路程 若不存在则-1
  48.  
  49. int min1 = s,min2 = 0; // via 的权值min1初始为0
  50. for (int i = 0; i < MAXV ;i++) d[i] = infinite;
  51. while(min1 != e && min1 != infinite){// 找到了终点或者是找遍了整个集合
  52. flag[min1] = true;
  53. int temp1=infinite,temp2=infinite;
  54. for (int i = 0; i < n; i++ ){ //以 [0]-- 1 --- [1] 为例;一开始标记了flag[0]=true so跳过
  55. if (flag[i]) continue; // | | //找到via[1][min1(此时为0)]发现比较小 数值先存起来
  56. //| 3--[2] --1| //继续找via[2][0]发现比之前的大 不存
  57. if (min2 + via[i][min1] < d[i]){ //把之前找到的那个较短值的点给min1(变成1)标记[1]为true
  58. d[i] = min2 + via[i][min1]; //现在我们要做的就是该点加上之前那个最小的权看会不会比 via[i][min1]小 继续找
  59. }
  60. if (temp2 > d[i]){
  61. temp2 = d[i];
  62. temp1 = i;
  63. }
  64. }
  65. min2 = temp2; min1 = temp1;
  66. }
  67. return (d[e] == infinite) ? (-1) : (d[e]);
  68. }
  69.  
  70. void init(){
  71. for (int i = 0 ; i < MAXV; i++){
  72. for (int j = 0; j < MAXV ;j++)
  73. via[i][j] = infinite;
  74. flag[i] = false; //初始化 标记数组为 每个点都是false
  75. }
  76. for (int i = 0; i < n_vias; i++){
  77. int a,b,d;
  78. scanf("%d%d%d",&a,&b,&d);
  79. if (via[a][b] > d){ // 排除输入重复的边
  80. via[a][b] = d;
  81. via[b][a] = d;
  82. }
  83. }
  84. }
  85.  
  86. int main()
  87. {
  88. // freopen("in.txt","r",stdin);
  89. while( scanf("%d%d",&n_villages,&n_vias) != EOF ){//城镇数 和 道路数
  90. init(); // 初始化 + 输入
  91. int start,end;
  92. scanf("%d%d",&start,&end);
  93. if (start == end) {cout << "0" << endl;continue;} // 起点终点相同
  94. cout << Dijkstra(start,end,n_villages) << endl;
  95. }
  96. return 0;
  97. }

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题的更多相关文章

  1. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  2. hdu 1874 畅通工程续 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...

  3. hdu 1874 畅通工程续 (dijkstra(不能用于负环))

    畅通工程续Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

  5. HDU 1874畅通工程续(迪杰斯特拉算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)     ...

  6. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...

  7. HDU 1874 畅通工程续【Floyd算法实现】

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)

    题目链接: 传送门 畅通工程续 Time Limit: 1000MS     Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...

  9. HDU——1874畅通工程续(Dijkstra与SPFA)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

随机推荐

  1. ionic2添加支付宝插件出现问题

    安装本地路径插件正常  编译正常  在打开支付页面时候 就报这个错 在手机app点击无效 错误信息: ERROR Error: Uncaught (in promise): Error: No pro ...

  2. Myeclipse报错:The word is not correctly spelled

    在eclipse下的Window--Preference输入spell,然后把第一个复选框“Enable spell checking"给去掉就可以了.

  3. jdbc之Statement和Preparement

    Jdbc DML 操作 Statement:静态SQL操作 每次操作都会将sql语句提交到数据库执行一次,性能比较低 // 1.加载驱动程序 Class.forName(driverName); // ...

  4. C语言中赋值表达式的返回值是什么?

    我们或多或少都有过,或者见过将赋值表达式参与运算的情况.这通常会伴随着一些意想不到的问题.今天我就见到了一段奇怪的代码: #include<stdio.h> int main() { ; ...

  5. 转:c# Linq 的分页[转]

    转:http://www.cnblogs.com/leleroyn/archive/2008/05/14/1196811.html 很多学习Linq的朋友肯定有自己所不同的方法,考虑这个问题我所想到的 ...

  6. NetWork——TCP的流量控制和拥塞控制

    ,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大. 这里为什么替换掉了慢开始算法呢,这是因为收到重复的ACK不仅仅告诉我们一个分组丢失了,由于接收方只有在收到另一个报文段时才会产生重复的ACK,所 ...

  7. [agc011F]Train Service Planning-[线段树优化dp+神秘思考题]

    Description 传送门 Solution 请围观lhx大佬的博客(大佬写的太好了我都没有写的动力了em) Code #include<iostream> #include<c ...

  8. day6 网络 HTML模板

    1.HTML模板 HTML模板 baidu一下 http://www.cssmoban.com/ http://www.cnblogs.com/web-d/archive/2010/04/16/171 ...

  9. js创建对象 object.create()用法

    Object.create()方法是ECMAScript 5中新增的方法,这个方法用于创建一个新对象.被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性. 语法: Object.crea ...

  10. python爬虫入门之URL

    python爬虫,顾名思义是爬取信息的.大数据时代,信息的获取是非常关键的,它甚至能决定一个公司大发展的方向与未来,互联网就好像一张大网,人们想要获取信息就要从这张大网里爬取,这种手段也可以称为搜索引 ...