题目描述

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

输入

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

输出

对每个测试用例,在1行里输出最小的公路总长度。

样例输入

8
1 2 42
1 3 68
1 4 35
1 5 1
1 6 70
1 7 25
1 8 79
2 3 59
2 4 63
2 5 65
2 6 6
2 7 46
2 8 82
3 4 28
3 5 62
3 6 92
3 7 96
3 8 43
4 5 28
4 6 37
4 7 92
4 8 5
5 6 3
5 7 54
5 8 93
6 7 83
6 8 22
7 8 17
0

样例输出

82

第一版:时间超限

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int maxn = 100;
const int inf = 1000000000;int n; //村庄数目int G[maxn][maxn];
int d[maxn];
bool vis[maxn] = {false};int prim(int s)
{fill(d, d+maxn, inf);d[s] = 0;int ans = 0;for(int i = 1; i <= n; i++){int u = -1, min = inf;for(int j = 1; j <= n; j++){if(vis[j] == false && d[j] < min){u = j;min = d[j];}}if(u == -1) return -1;vis[u] = true;ans += d[u];for(int v = 1; v <= n; v++){if(vis[v] == false && G[u][v] != inf && G[u][v] < d[v]){d[v] = G[u][v];}}}return ans;
}
int main()
{while(scanf("%d", &n) != 0){
//      if(n == 0) break;int m = n * (n-1) / 2;fill(G[0], G[0]+maxn*maxn, inf); //初始化for(int i = 1; i <= m; i++){int a, b, c;scanf("%d%d%d", &a, &b, &c);G[a][b] = c;G[b][a] = c;}int ans = prim(1);if(ans != 0)printf("%d\n", ans);}return 0;
}

第二版:运行错误

提示:数组越界。但是我看了一圈没发现...有看出的同仁请告知,万分感谢!

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int maxn = 100+10;
const int inf = 1000000000;int a; //村庄数目//kruskal
struct edge
{int u, v, dis;
}E[maxn];int father[maxn];
int find_father(int x)
{int a = x;while(x != father[x]){x = father[x];}while(a != father[a]){int z = a;a = father[a];father[z] = x;}return x;
}bool cmp(edge a, edge b)
{return a.dis < b.dis;
}int kruskal(int n, int m)
{int ans = 0, num_edge = 0;for(int i = 1; i <= n; i++){father[i] = i;}sort(E, E+m+1, cmp);for(int i = 0; i < m; i++){int fa = find_father(E[i].u);int fb = find_father(E[i].v);if(fa != fb){father[fa] = fb;ans += E[i].dis;num_edge++;if(num_edge == n - 1) break;}}if(num_edge != n - 1){return -1;}else return ans;
}int main()
{while(scanf("%d", &a) != 0){int b = a * (a-1) / 2;for(int i = 0; i < b; i++){scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].dis);}int ans = kruskal(a, b);printf("%d\n", ans);}return 0;
}

AC代码:

终于AC了,发帖求助的。真是犯了低级错误。边数为N(N-1)/2,自己开的maxn太小,所以超了!流泪,我太菜鸡惹...

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int maxn = 5010;
const int inf = 1000000000;int a; //村庄数目//kruskal
struct edge
{int u, v, dis;
}E[maxn];int father[110];
int find_father(int x)
{int a = x;while(x != father[x]){x = father[x];}while(a != father[a]){int z = a;a = father[a];father[z] = x;}return x;
}bool cmp(edge a, edge b)
{return a.dis < b.dis;
}int kruskal(int n, int m)
{int ans = 0, num_edge = 0;for(int i = 1; i <= n; i++){father[i] = i;}sort(E, E+m, cmp);for(int i = 0; i < m; i++){int fa = find_father(E[i].u);int fb = find_father(E[i].v);if(fa != fb){father[fa] = fb;ans += E[i].dis;num_edge++;if(num_edge == n - 1) break;}}if(num_edge != n - 1){return -1;}else return ans;
}int main()
{while(scanf("%d", &a)&& a){int b = a * (a-1) / 2;for(int i = 0; i < b; i++){scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].dis);}int ans = kruskal(a, b);printf("%d\n", ans);}return 0;
}

Codeup墓地-问题 A: 还是畅通工程相关推荐

  1. Codeup墓地-问题 D: 继续畅通工程

    题目描述 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建 ...

  2. codeup墓地目录(算法笔记习题刷题笔记)

    在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门模拟->简单模拟 ...

  3. codeup墓地目录

    代码内容为原创C++ 在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门 ...

  4. [kuangbin带你飞]专题六 最小生成树 L - 还是畅通工程 (简单最小生成树)

    L - 还是畅通工程 题目链接:https://vjudge.net/contest/66965#problem/L 题目: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府&qu ...

  5. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

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

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

  7. 【1863】畅通工程 (HDU)

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

  8. HDOJ 1874 HDU 1874 畅通工程续 ACM 1874 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址:          http://acm.hdu.edu.cn/showproblem.php?pid=1874 ...

  9. 畅通工程 HDU - 1233 

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

最新文章

  1. MySQL Replace INTO的使用
  2. c++入门之 再话类
  3. 删除未使用的引用 | Visual Studio 2019(16.10)新功能试用
  4. Word2vec学习笔记总结
  5. web里如何在背景图片上放置div元素_2020年web前端开发经典面试题总结整理(建议收藏)...
  6. linux ps画图,PhotoGIMP:让Linux下的GIMP交互体验就像Photoshop
  7. java调用数据库存储过程_Java调用SQL Server的存储过程详解
  8. 20210602:力扣第243周周赛(下)
  9. r语言c50算法的过程,【机器学习与R语言】5-规则学习算法
  10. python输入路径读取文件-python获取程序执行文件路径的方法(推荐)
  11. Linux命令:more
  12. explorer.exe应用程序错误,该内存不能为READ
  13. C语言课设家庭财务小管家(大作业)
  14. Endnote--在参考文献列表中添加DOI
  15. 天猫精灵服务器修改密码,天猫精灵怎么解绑 天猫精灵解绑账号方法
  16. Python的excel工作簿写入与读取操作
  17. 基于Python的数据结构实验——顺序表与单链表建立与操作(附详细代码和注释)
  18. 集成学习-Bagging和Pasting
  19. 设定所有版本的谷歌浏览器支持flash
  20. 抖音短连接v.douyin.com/xxx 如何生成?

热门文章

  1. STL 之adjacent_find, merge,inplace_merge
  2. C++设计模式之桥接模式
  3. TCP协议疑难杂症全景解析|硬核
  4. Java集合框架:ArrayList
  5. 腾讯2020校园招聘----覆盖
  6. FPGA视频加速的未来
  7. 腾讯云前端性能优化大赛火热招募中!
  8. 这一次,腾讯用AI让手语“发声”
  9. FFmpeg 源代码:avcodec_find_decoder()和avcodec_find_decoder_by_name()
  10. curl获取站点的各类响应时间(dns解析时间,响应时间,传输时间)