HDU1863 畅通工程【Kruskal算法+并查集】
畅通工程Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 31 2 11 3 22 3 41 32 3 20 100
Sample Output
3?
Source
浙大计算机研究生复试上机考试-2007年
|
问题链接:HDU1863 畅通工程。
问题描述:参见上文。
问题分析:
这是一个最小生成树的为问题,解决的算法有Kruskal(克鲁斯卡尔)算法和Prim(普里姆)算法。
程序说明:
本程序使用Kruskal算法实现。有关最小生成树的问题,使用克鲁斯卡尔算法更具有优势,只需要对所有的边进行排序后处理一遍即可。程序中使用了并查集,用来判定加入一条边后会不会产生循环。程序中,图采用边列表的方式存储,按边的权从小到大顺序放在优先队列中,省去了排序。
代码不够简洁,又写了一个简洁版。
AC的C++语言程序(简洁版)如下:
/* HDU1863 畅通工程 */#include <iostream>
#include <queue>
#include <stdio.h>using namespace std;const int N = 100;
int f[N + 1], cnt;void UFInit(int n)
{for(int i = 1; i <=n; i++)f[i] = i;cnt = n;
}int Find(int a) {return a == f[a] ? a : f[a] = Find(f[a]);
}bool Union(int a, int b)
{a = Find(a);b = Find(b);if (a != b) {f[a] = b;cnt--;return true;} elsereturn false;
}struct edge {int src, dest, cost;bool operator < (const edge& n) const {return cost > n.cost;}
};int main()
{edge e;int n, m;while(scanf("%d%d", &n, &m) != EOF && n) {priority_queue<edge> q; // 优先队列,用于存储边列表UFInit(m);// 构建优先队列while(n--) {scanf("%d%d%d", &e.src, &e.dest, &e.cost);q.push(e);}// Kruskal算法:获得最小生成树int ans=0, count=0;while(!q.empty()) {e = q.top();q.pop();if(Union(e.src, e.dest)) {count++;ans += e.cost;}if(count == m - 1)break;}// 连通性判定,输出结果if(cnt == 1)printf("%d\n", ans);elseprintf("?\n");}return 0;
}
AC的C++语言程序如下:
/* HDU1863 畅通工程 */#include <iostream>
#include <queue>
#include <cstdio>using namespace std;const int MAXN = 100;// 并查集
int v[MAXN+1];
class UF {int length;
public:UF() {}// 压缩int Find(int x) {if(x == v[x])return x;elsereturn v[x] = Find(v[x]);}bool Union(int x, int y) {x = Find(x);y = Find(y);if(x == y)return false;else {v[x] = y;return true;}}// 唯一树根判定连通性bool isconnect() {int root = -1;for( int i=1 ; i<=length ; i++ )if(root == -1)root = Find(i);elseif(Find(i) != root)return false;return true;}void reset(int n) {length = n;for(int i=0; i<=n; i++)v[i] = i;}
};struct edge {int src, dest, cost;bool operator < (const edge& n) const {return cost > n.cost;}
};int main()
{UF uf;edge e;int n, m;while(scanf("%d%d", &n, &m) != EOF && n) {priority_queue<edge> q; // 优先队列,用于存储边列表uf.reset(m);// 构建优先队列while(n--) {scanf("%d%d%d", &e.src, &e.dest, &e.cost);q.push(e);}// Kruskal算法:获得最小生成树int ans=0, count=0;while(!q.empty()) {e = q.top();q.pop();if(uf.Union(e.src, e.dest)) {count++;ans += e.cost;}if(count == m - 1)break;}// 连通性判定,输出结果if(uf.isconnect())printf("%d\n", ans);elseprintf("?\n");}return 0;
}
HDU1863 畅通工程【Kruskal算法+并查集】相关推荐
- hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊 就是注意一点 输入边的信息时,角标 ...
- UVA10034 Freckles【Kruskal算法+并查集】
In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to fo ...
- HDU1875 畅通工程再续【Kruskal算法+并查集】
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU1233 还是畅通工程【Kruskal算法+并查集】
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...
- 还是畅通工程(1233 并查集+kruskal)
还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 最小生成树kruskal算法并查集版 C语言实现
今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...
- 最小生成树KrusKal算法(并查集)
洛谷p1111链接 克鲁斯卡尔算法的思路就是由森林变成树的过程,其中最主要的就是贪心和并查集的应用. 我们知道链接n个点需要n-1条边,这就满足的最后生成的是一颗树,而不是一个环.在这n-1条边的选择 ...
- 最小生成树Kruskal算法+并查集检查连通
/* 10 6 1 2 6 1 3 1 1 4 5 2 3 5 2 5 3 3 4 5 3 5 6 3 6 4 4 6 2 5 6 6 */// 本例解决最小生成树问题 // 并查集来加快效率 // ...
最新文章
- SCRUM敏捷实践—任务看板
- Verilog以及VHDL所倡导的的代码准则
- spring service ,controller反向代理生成AOP代理类流程
- 详解Dart中如何通过注解生成代码
- [蓝桥杯2015初赛]移动距离
- 洛谷 P1101 单词方阵
- django 表单html5,我们如何在django管理表单中添加动态html5数据属性
- web程序前后台功能实现_好程序员web前端教程之JS继承实现方式解析
- 牛客网编程题06--取近似值
- linux运行bin not found,自己制作根文件后,程序-/bin/sh:XXX:not found错误
- 用Google XML Sitemaps为你的网站创建Sitemap
- 语言判断一个整数是奇数还是偶数_一个变量“存储”任意多的数 从“康托配对函数”聊开去...
- stimulsoft mysql_StimulSoft——将炫酷的报表写入你的应用程序
- ffmpeg vsync参数分析
- CodeForces 158B Taxi(代数算式解题)
- 关于Spring.split()踩坑
- 山东计算机网络期末试题,山东轻工业学院计算机网络期末试题A(13页)-原创力文档...
- 面经手册 · 开篇《面试官都问我啥》
- Hinton等谈深度学习十年;PyTorch落地Linux基金会的影响;机器学习界的“GitHub”|AI系统前沿动态
- J2ME游戏开发(从零开始)