HDU 1233 还是畅通工程
2016-03-24 23:17
453 查看
赤裸裸的最小生成树啊。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX = 105; int fa[MAX], r[MAX]; struct EDGE { int from, to, cost; }edge[MAX * MAX]; bool comp(EDGE a, EDGE b) { return a.cost < b.cost; } void init(int n) { for (int i = 1; i <= n; ++i) { fa[i] = i; r[i] = 1; } } int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } void unite(int a, int b) { a = find(a); b = find(b); if (a == b) return ; if (r[a] < r[b]) { fa[a] = b; } else { fa[b] = a; if (r[a] == r[b]) r[a]++; } } int main() { int n; while (scanf("%d", &n)) { if (n == 0) break; int t_from, t_to, t_cost; init(n); int cnt = 0; //cout << n << endl; n = n * (n - 1) / 2; //printf("n = %d\n", n); for (int i = 1; i <= n; ++i) { scanf("%d%d%d", &t_from, &t_to, &t_cost); ++cnt; edge[cnt].from = t_from; edge[cnt].to = t_to; edge[cnt].cost = t_cost; } int res = 0; sort(edge + 1, edge + 1 + cnt, comp); for (int i = 1; i <= cnt; ++i) { if(find(edge[i].from) != find(edge[i].to)) { res += edge[i].cost; unite(edge[i].from, edge[i].to); } } printf("%d\n", res); } return 0; }
相关文章推荐
- Swift 语言指南( Swift 语言主流学习资源)
- 浏览器与HTML5的相辅相成
- 基于jquery实现图片上传本地预览功能
- 梦断代码阅读笔记01
- Ubuntu14.04更换软件源
- java素数
- 函数模板在c++动态顺序表中的大作用
- 史上最详细的HashMap详解--源码分析
- Android 报错Android - Performing stop of activity that is not resumed
- FZU 2171 线段树 区间更新求和
- Bootstrap_标签
- AmIBeingDebugged 函数方法的定义实现
- webservice中将dataset 压缩
- 2016.03.24
- oschina git 使用过程一:项目创建
- 《世界是数字的》 读书笔记
- 235. Lowest Common Ancestor of a Binary Search Tree
- 大家一起和snailren学java-(五)访问控制权限
- Bootstrap_分页
- 第三百五十六天 how can I 坚持