题目:hdoj-1233

题解:

本题是典型的最小生成树问题,给出的是无向图,这里使用的方法是Prim最小生成树算法。

Reference

Prim算法参照:最小生成树-Prim算法和Kruskal算法,讲的很详细了。

测试的时候可以参考这幅图:

算法介绍:

主要步骤(摘自上文链接):

1).输入:一个加权连通图,其中顶点集合为V,边集合为E;

2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;

3).重复下列操作,直到Vnew = V:

a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;

4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

本题维护两个数组:

(1)Primgh二维数组,存储图。

(2)refer数组,判断一个节点是否在Vnew中。

用于存边的数组Enew在本题中不需要。

代码:

  1. //
  2. // main.cpp
  3. // Prim_1233
  4. //
  5. // Created by wasdns on 16/11/24.
  6. // Copyright © 2016年 wasdns. All rights reserved.
  7. //
  8. #include <iostream>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <algorithm>
  12. #include <string>
  13. #include <string.h>
  14. #define maxn 10000005;
  15. using namespace std;
  16. int Primgh[10000][10000]; //存储图
  17. bool refer[10005]; //判断是否在Enew中
  18. /*
  19. 用于初始化的函数
  20. */
  21. void Initial(int n, int m)
  22. {
  23. int i, j;
  24. for (i = 1; i <= n; i++)
  25. {
  26. refer[i] = false;
  27. for (j = 1; j <= n; j++)
  28. {
  29. if (i == j) {
  30. Primgh[i][j] = 0;
  31. }
  32. else Primgh[i][j] = maxn;
  33. }
  34. }
  35. int u, v, w;
  36. for (i = 1; i <= m; i++)
  37. {
  38. cin >> u >> v >> w;
  39. Primgh[u][v] = w;
  40. Primgh[v][u] = w;
  41. }
  42. }
  43. /*
  44. Prim算法,主体部分
  45. */
  46. int Prim_Alg(int n, int m)
  47. {
  48. Initial(n, m);
  49. int i, j, k;
  50. int ans = 0;
  51. //最小生成树的路径长度
  52. refer[1] = true;
  53. //选择点1出发
  54. //最小生成树一共有n-1条边,因此需要寻找最短边n-1次,基于贪心
  55. for (i = 1; i <= n-1; i++)
  56. {
  57. int minlen = maxn;
  58. //minlen: 在Vnew中的节点所连接的边中,寻找cost最小的边
  59. int rcd = 1;
  60. //cost最小的边有两个节点,rcd记录其中的不属于Vnew的节点
  61. for (j = 1; j <= n; j++)
  62. {
  63. if (!refer[j]) continue;
  64. //遍历Vnew中的所有节点
  65. int len1 = maxn;
  66. //对于Vnew中的某个节点来说,所连接的最短的路径cost大小
  67. int rcd1 = 1;
  68. //对于Vnew中的某个节点来说,rcd记录的节点
  69. //贪心,寻找这个节点连接的cost最小的路径
  70. for (k = 1; k <= n; k++)
  71. {
  72. if (!refer[k])
  73. {
  74. if (Primgh[j][k] < len1) {
  75. len1 = Primgh[j][k];
  76. rcd1 = k;
  77. }
  78. }
  79. }
  80. if (len1 < minlen) {
  81. //判断贪心得到的路径是否是全局cost最短
  82. minlen = len1;
  83. rcd = rcd1;
  84. }
  85. }
  86. /*Debug:*/
  87. //char check = 'A'+rcd-1;
  88. //cout << "rcd: " << check << endl;
  89. //cout << "minlen: " << minlen << endl;
  90. refer[rcd] = true;
  91. //贪心求出cost最小的路径,rcd记录的节点入Vnew
  92. rcd = 1;
  93. //重置rcd
  94. ans += minlen;
  95. }
  96. return ans;
  97. }
  98. int main()
  99. {
  100. int n, m;
  101. while (scanf("%d", &n) != EOF)
  102. {
  103. if (n == 0) break;
  104. m = n * (n-1) / 2;
  105. cout << Prim_Alg(n, m) << endl;
  106. }
  107. return 0;
  108. }

2016/11/24

hdoj-1233-还是畅通工程的更多相关文章

  1. Kruskal HDOJ 1233 还是畅通工程

    题目传送门 /* 最小生成树之kruskal算法--并查集(数据结构)实现 建立一个结构体,记录两点和它们的距离,依照距离升序排序 不连通就累加距离,即为最小生成树的长度 */ #include &l ...

  2. Hdoj 1233.还是畅通工程 题解

    Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直 ...

  3. hdoj 1233 还是畅通工程---最小生成树---prime算法

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1233 可以用Kruskal来做,不过当图的边比较稠密的时候用prime会更快一些. AC代码:296MS ...

  4. hdoj 1233 还是畅通工程(最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路分析:该问题为最小生成树问题,使用kruskal算法或者prim算法即可解决: 代码如下: ...

  5. HDU 1233 还是畅通工程(Kruskal算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)   ...

  6. HDU.1233 还是畅通工程(Prim)

    HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...

  7. hdu 1233 还是畅通工程 (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    ...

  8. HDU 1233 还是畅通工程(最小生成树)

    传送门 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. hdu 1233 - 还是畅通工程(MST)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. HDU 1233 还是畅通工程 (最小生成树)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

随机推荐

  1. kvm虚似机监控

    [root@ok Desktop]# yum install virt-top [root@ok Desktop]# virt-top virt-top 22:53:44 - x86_64 4/4CP ...

  2. 使用jquery制作可视化的组织结构

    组织结构是做项目里面经常用到的,但是要做成可视化的效果比较少,多数使用树结构来表示,但是对于客户来说不是太直观.可以用jOrgChart来实现.如下图的效果,这样就比较直观. 首先你要去下载jOrgC ...

  3. Man简单介绍

    转自:http://os.51cto.com/art/201312/425525.htm Linux系统提供了相对比较丰富的帮助手册(man),man是manual的缩写,在日常linux系统管理中经 ...

  4. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

  5. AndroidManifest.xml相关知识

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest  ...

  6. Harris角点

    1. 不同类型的角点 在现实世界中,角点对应于物体的拐角,道路的十字路口.丁字路口等.从图像分析的角度来定义角点可以有以下两种定义: 角点可以是两个边缘的角点: 角点是邻域内具有两个主方向的特征点: ...

  7. AppInventor学习笔记(四)——打地鼠应用学习

    一.组件设计 1.整体预览 2.图片精灵的添加 (1)首先加入一个画布进去 调节属性如图 (2)添加精灵 添加精灵,然后上传张图片进行属性修改 3.加入Clock 直接加入,设定为1000ms 二.B ...

  8. vb.net三层实现登录例子

    看三层已经很长时间了,中间有经过了期末考试.回家等等琐事,寒假开学的我已经回想不起什么事三层了,经过了三四天的重新复习,再加上查看各期师哥师姐的博客,终于,自己完成了C#视频中的登录小例子,下面就和大 ...

  9. 简单几何(直线与圆的交点) ZOJ Collision 3728

    题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...

  10. BZOJ2905 : 背单词

    首先对所有单词建立AC自动机,$S$是$T$的子串等价于$T$的某个前缀通过$fail$链可以走到$S$的终止节点,即$S$的终止节点是$T$某个前缀在$fail$树上的祖先. 设$f[i]$表示考虑 ...