1. /***********************************************************************************************************************
  2. map 存路径,值为权值; weight保存个点到源起点的权值; pre保存结点的前驱,即与源起点有路的下一个点
  3. length 生成的最短距离 point 图上共有多少点 sign该点是否已经找过
  4. 算法prim:
  5. 从一个结点的子图开始构造生成树:选择连接当前子图和子图外结点的最小权边,将相应结点和边加入子图,直至将所有结点加入子图
  6. ***********************************************************************************************************************/
  7. #include <stdio.h>
  8. #include <string>
  9. #define SIZE 1100
  10. #define INF 0x7fffffff
  11. int map[1100][1100], weight[1100], pre[1100], length, point;
  12. bool sign[1100];
  13. void prim(int weight[],int map[][SIZE], int pre[], bool sign[], int &length, int point_num, int source)
  14. { //source源起点,一定要是路径中有的
  15. for(int i=1; i<=point_num; i++) //这里的路径的标号都 > 1,记录所以点到源起点的权值,前驱,将该点置为已经查找
  16. {
  17. weight[i] = map[source][i];
  18. pre[i] = source; sign[i] = true;
  19. }
  20. sign[source] = false; length = 0;
  21. for(int i=1; i<point_num; i++) //枚举n-1个点,即n-1个通路
  22. {
  23. int min = INF, sign_node = i; //sign_node 记录找到的最小的下一个点
  24. for(int j=1; j<=point_num; j++) //查找最小权值的路径
  25. {
  26. if(sign[j] && weight[j] < min)
  27. {min = weight[j]; sign_node = j;}
  28. }
  29. {sign[sign_node] = false; length += min; } //找到点置为已找到,长度相加,
  30. //可以在这里添加一个标记,使他值等于min,如果最后值等于最大值,则不能生成最小生成树
  31. for(int j=1; j<=point_num; j++) //重新设定源起点,将剩下的未找的点加入
  32. {
  33. if(weight[j] > map[sign_node][j] && sign[j] )
  34. {weight[j] = map[sign_node][j]; pre[j] = sign_node;}
  35. }
  36. }
  37. }
  38. void input(int n, int map[][SIZE])
  39. {
  40. for(int i=1; i<=n ;i++)
  41. {
  42. int a, b, c;
  43. scanf("%d%d%d", &a, &b, &c);
  44. map[a][b] = c; map[b][a] = c;
  45. }
  46. }
  47. int main()
  48. {
  49. int N;
  50. while(~scanf("%d", &N) && N )
  51. {
  52. //scanf("%d", &M);
  53. //int map[1100][1100], weight[1100], pre[1100], length, point;
  54. //bool sign[1100];
  55. for(int i=0; i<=N; i++) //初始化,N是端点个数
  56. {
  57. weight[i] = INF; pre[N] = 0;
  58. for(int j=0; j<=N; j++)
  59. map[i][j] = INF;
  60. }
  61. memset(sign, false, sizeof(sign) );
  62. length = point = 0;
  63. input( N*(N-1)/2, map);
  64. prim(weight, map, pre, sign, length, N, 1); //查找,注意这个1 它是源起点,一定要是在路径上已知的点
  65. printf("%d\n", length);
  66. }
  67. return 0;
  68. }
  69. /*
  70. Problem Description
  71. 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
  72. Input
  73. 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
  74. 当N为0时,输入结束,该用例不被处理。
  75. Output
  76. 对每个测试用例,在1行里输出最小的公路总长度。
  77. Sample Input
  78. 3
  79. 1 2 1
  80. 1 3 2
  81. 2 3 4
  82. 4
  83. 1 2 1
  84. 1 3 4
  85. 1 4 1
  86. 2 3 3
  87. 2 4 2
  88. 3 4 5
  89. 0
  90. Sample Output
  91. 3
  92. 5
  93. */
来自为知笔记(Wiz)

附件列表

转载于:https://www.cnblogs.com/sober-reflection/p/5e68cd23427f47403e83f66013d4f7b7.html

hdu 1233 最小生成树相关推荐

  1. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊  就是注意一点 输入边的信息时,角标 ...

  2. HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)

    原题地址 http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可 ...

  3. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  4. hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...

    赤裸裸滴最小生成树(MST),刚学的玩意,用两种方法熟练一下.(都是greedy) Kruskal方法:先对边按照代价非递减排序,再不断添加边且不产生环路,当边数=点数-1结束.判断加入(v,w)是否 ...

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

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

  6. HDU 1233 还是畅通工程。

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1233 x 解题思路: 简单的最小生成树 实现代码: #include <iostream> ...

  7. HDU 4081 最小生成树(或者次小生成树)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4081 Problem Description There were n cities in Chin ...

  8. HDU 4408 最小生成树计数详细解释

    一些blog看我的好迷,假解释看哭我了,这是我自己的理解,一道题看1天.菜哭 HDU 4408 无向图的最小生成树计数原理 就是在kruskal处理边的时候不断地找到联通块(由多个同长度的边组成的联通 ...

  9. hdu 1598(最小生成树变形)

    解题思路:这道题我一开始的思路是动规,dp_max[i][j]表示i-j的最大边,dp_min[i][j]表示i-j的最小边,可是这样会有问题,有可能最大边与最小边不在同一条路径上,这样就很麻烦了. ...

最新文章

  1. 使用ssh连接到centos7中docker容器
  2. 在 64 位版本的 Windows 上,如何在 32 位版本的 ASP.NET 1.1 和 64 位版本的 ASP.NET 2.0 之间切换...
  3. Spring Boot Profile使用详解及配置源码解析
  4. php制表网页打印到a4纸,A4纸网页打印 html网页页面的宽度设置成多少
  5. 12个让您震撼的Linux终端命令
  6. 铁血规则:事件预订与取消预订
  7. java获取语言_如何在java中获取语言环境对象?
  8. 3.c语言结构体成员内存对齐详解
  9. 扒一扒开源世界有哪些licenses?
  10. Java程序员必备的11大Intellij插件
  11. 基于RV1126平台imx291分析 --- media部件连接 四
  12. 【Verilog】移位寄存器总结:移位寄存器、算数移位寄存器、线性反馈移位寄存器(LFSR)
  13. rtmp协议java实现_RTMP 协议的一个 Java 实现:Flazr
  14. mysql临时表创建_MYSQL临时表创建索引
  15. 抖音热门技术998 修改视频md5
  16. 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 matlab程序(二)
  17. 7-16 新浪微博热门话题 (30分)
  18. MySQL第41题怎么评分_MYSQL练习题54道(包含尽可能多的解决方法及思路)
  19. SQL查询 — 自连接的用法
  20. 修改Win7工具栏资源管理器打开后的默认路径

热门文章

  1. 【POJ - 1751】Highways (最小生成树)
  2. harmonyos消息服务器,第三方纯HarmonyOS应用太少,你还愿意升级吗?
  3. oracle找到表的位置,查看Oracle表中的指定记录在数据文件中的位置
  4. 普通IO流字符输入输出流文件拷贝
  5. linux-如何限制普通用户的磁盘使用空间-磁盘配额quota,Linux系统下如何进行磁盘配额Quota的设置...
  6. 《帝友 P2P 网络借贷系统》
  7. 倒果汁c语言,水果榨汁补维生素C?这些补维生素的错误别再犯了
  8. Android开发(1) | Fragment 的应用——新闻应用
  9. 链表的代码实现【数据结构F】
  10. caffe各层参数详解