杭电ACM1301——Jungle Roads~~最小生成树
2015-06-11 23:33
405 查看
这题,简单的最小生成树问题。
只是输入的时候比较麻烦,一开始的N,是村庄的个数,下面N - 1 条信息,一开始的大写字母S和数K,是S村庄有K条路连接,后面是K个村庄以及权值。
处理好了输入的数据,就很简单了。
下面的是AC的代码:
只是输入的时候比较麻烦,一开始的N,是村庄的个数,下面N - 1 条信息,一开始的大写字母S和数K,是S村庄有K条路连接,后面是K个村庄以及权值。
处理好了输入的数据,就很简单了。
下面的是AC的代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; class data { public: int from, to, cost; }; data Road[100]; int n, count1; int par[30]; int cmp(data &a, data &b) //权值从小到大排 { return a.cost < b.cost; } int finds(int x) //并查集查找函数 { if(par[x] == x) return x; else return par[x] = finds(par[x]); } void unite(int x, int y) //合并函数 { x = finds(x); y = finds(y); if(x == y) return; else par[y] = x; } int same(int x, int y) //判断是否属于同一个并查集 { return finds(x) == finds(y); } int solve() //构造最小生成树函数 { int res = 0; for(int i = 0; i < count1; i++) { data d = Road[i]; if(!same(d.from, d.to)) { unite(d.from, d.to); res += d.cost; } } return res; } int main() { // freopen("data.txt", "r", stdin); int i, j, k, a, w; char s; while(scanf("%d", &n) != EOF && n) //输入的处理 { getchar(); count1 = 0; for(i = 0; i < 30; i++) par[i] = i; for(i = 0; i < n - 1; i++) { scanf("%c%d", &s, &k); a = s - 'A'; getchar(); for(j = 0; j < k; j++) { scanf("%c%d", &s, &w); Road[count1].from = a; Road[count1].to = s - 'A'; Road[count1].cost = w; count1++; getchar(); } } sort(Road, Road + count1, cmp); int ans = solve(); printf("%d\n", ans); } return 0; }
相关文章推荐
- TCP深入解析(一)
- Spring单例与线程安全小结
- iOS证书--开发证书(Development)的申请
- 通过简单的方法适应iOS7中的UIViewController,同时兼容iOS6
- 解决Unity3D操作界面字体模糊的问题
- Xcode4使用技巧
- 我的第一个iOS效率应用 (6 Things) 上架经验谈
- JAVA第四次实验
- 通过脚本创建数据库与表
- [笔记]python pickle模块
- DAO层,Service层,Controller层,View层
- vitamio视频框架-导入方法
- 内置对象Clob对从数据库表中取的字符大对象CLOB类型的列值进行读取操作
- boost之学习备注浅析timer篇
- 基于TCP协议简单的文件传输
- 怎样配置git密匙
- 黑马程序员------面向对象01
- Linux 内核开发 - Eclipse内核开发环境搭建
- C#wenbbrowser浏览器的详细用法
- openssl编程