点击打开链接

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 

Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 
当N为0时,输入结束,该用例不被处理。 
Output对每个测试用例,在1行里输出最小的公路总长度。 
Sample Input

3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

Sample Output

3
5Huge input, scanf is recommended.

隔了那么长时间再来做这道题,还是犯了上次同样的错误,初始化parent数组

for(int i = 0; i <= n; i++)

这个地方一定是<=,一直不过真的很不爽,还是自己对代码不熟悉。

AC代码

#include<stdio.h>
#include<algorithm>using namespace std;int parent[105]; //定义parent数组用来判断边与边是否形成环路
int sum;struct Edge
{int beginn;int endd;int weight;} edges[5005];bool cmp(Edge a, Edge b)
{if(a.weight == b.weight)return a.beginn < b.beginn;elsereturn a.weight < b.weight;
}int Find(int f)
{while( parent[f] > 0 ){f = parent[f];}return f;}//Kruskal算法生成最小生成树
void MiniSpanTree_Kruskal(int x, int y)
{int i, n, m;for( i = 0; i <= x; i++ ){parent[i] = 0;}for( i = 0; i < y; i++ ){n = Find(edges[i].beginn);m = Find(edges[i].endd);if( n != m )    //如果n==m,则形成环路不满足!
        {parent[n] = m;      //将此边的结尾顶点放入下标为起点的parent数组中,表示此顶点已经在生成树集合中
sum += edges[i].weight;}}printf("%d\n", sum);
}int main()
{int t, i, ans;while(scanf("%d", &t) != EOF , t){sum = 0;ans = t*(t - 1)/2;for( i = 0; i < ans; i++ ){scanf("%d %d %d", &edges[i].beginn, &edges[i].endd, &edges[i].weight);}sort(edges, edges+ans, cmp);MiniSpanTree_Kruskal(t, ans);}return 0;}

还有一种叫做PRIM算法的也可以解这道题。

PRIM算法

转载于:https://www.cnblogs.com/ruruozhenhao/p/7406522.html

A - 还是畅通工程(最小生成树)相关推荐

  1. hdu1879 继续畅通工程 最小生成树

    继续畅通工程 此题明显属于最小生成树的题目 关于最小生成树,有两种方法,一种是Kruskal方法,一种是Prim算法,第一种用并查集即可实现 1 /* 2 hdu1879 3 2013-03-18 1 ...

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

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

  3. hdu 1879 继续畅通工程 (最小生成树)

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

  4. HDU 1879 继续畅通工程 最小生成树

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

  5. 还是畅通工程 最小生成树

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

  6. HDU 1863畅通工程(最小生成树)(prim算法)

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

  7. 畅通工程//最小生成树prim

    题目: 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  8. hdu 1879 继续畅通工程 最小生成树

    继续畅通工程                                                                             Time Limit: 2000/ ...

  9. 题目1017:还是畅通工程(最小生成树初步应用)

    题目链接:http://ac.jobdu.com/problem.php?pid=1017 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  10. HDU 1863 畅通工程 最小生成树

    思路: 比较典型的最小生成树的题目了..在这里用求最小生成树的经典算法K(Kruskal)算法和P(Prim)算法.我的 K 算法用的是结构体来存图,P 算法用的是邻接矩阵来存图,K算法的复杂度是O( ...

最新文章

  1. 阿里、拼多多P8面试分享!
  2. 【FPGA】单端口RAM的设计(异步读、同步写)
  3. 解决针对ubuntu11.04安装中文包后不能正常查看或使用pdf和Archiver的问题
  4. 根据浏览器navigator区分PC端还是移动端,区分操作系统,区分浏览器型号
  5. python在人工智能应用锁_python实现人工智能Ai抠图功能
  6. 数据算法之二叉树删除(BinaryTreeL Remove)的Java实现
  7. 最新版python如何安装qt5_Python3 搭建Qt5 环境的方法示例
  8. sql查询字段值只为汉字(桃)
  9. 企业IT架构转型之道(书)总结以及反思
  10. 数据库系统原理与设计(第3版)第二章课后习题
  11. android屏幕适配无效_Android 屏幕适配终结者
  12. sql语句练习题(mysql版)
  13. 给个华为服务器账号和密码忘了怎么办啊,华为路由器登陆用户名和密码忘了怎么办?...
  14. Docker配置阿里云镜像加速器以及镜像的常用操作命令
  15. acl 影响因子_计算机领域EI和SCI收录期刊及影响因子
  16. 盘点一份JS逆向代码转换为Python代码的教程
  17. 2022世界杯看球指南
  18. Deliberated Domain Bridging for Domain Adaptive Semantic Segmentation
  19. 《一个出身寒门的高考状元之死》
  20. Automatic Open-World Reliability Assessment

热门文章

  1. c语言英文单词倒着,C语言实现英文单词助手
  2. 华为畅享8的悬浮窗在哪里_1299元起,更大超清屏幕+强劲续航 华为畅享20 SE发布...
  3. 计算机趣味知识竞赛策划书,计算机趣味知识竞赛活动策划书.doc
  4. layui table行点击tr_layui的table单击行勾选checkbox功能方法
  5. 9模块化学习 java_Java 9模块
  6. python中rjust_Python字符串rjust()和ljust()
  7. android实例教程_Android内部存储示例教程
  8. 敬业签电脑手机云同步便签及安卓手机和苹果手机云同步桌面便签
  9. vscode中vue-cli项目es-lint的配置
  10. TypeScript + ES6