并查集模板题-HDU1856
2015-11-01 21:32
253 查看
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11137
看的出题目是要我们求有几棵树中儿子最多的一棵有几个儿子。每个小团体(所有互相认识的男孩在同一个小团体中)为一棵树。
最基本的并查集模板有个par[MAX]用来存放每个节点的父亲节点的下标。这道题我们需要再增加一个数组用来存放每个节点儿子数目(初始都为1,为本身),然后在合并时判断,儿子数小的合并到儿子数多的树上,同时更新儿子数。
注意大数字输入时要使用scanf,防止超时。
代码
看的出题目是要我们求有几棵树中儿子最多的一棵有几个儿子。每个小团体(所有互相认识的男孩在同一个小团体中)为一棵树。
最基本的并查集模板有个par[MAX]用来存放每个节点的父亲节点的下标。这道题我们需要再增加一个数组用来存放每个节点儿子数目(初始都为1,为本身),然后在合并时判断,儿子数小的合并到儿子数多的树上,同时更新儿子数。
注意大数字输入时要使用scanf,防止超时。
代码
#include<iostream> #include<cstdio> using namespace std; const int MAX = 10000005; int par[MAX]; int num[MAX]; void init(int n){ for (int i = 0; i < n; i++){ par[i] = i; num[i] = 1; } } //查找父亲节点 //查找的同时压缩,将该点到父亲节点一路上所有节点都连到根节点 int find(int x){ if (par[x] == x){ return x; } else return par[x] = find(par[x]); } //合并 void unite(int x, int y){ x = find(x); y = find(y); if (x == y) return; else{ if (num[x] > num[y]){ par[y] = x; num[x] += num[y]; } else{ par[x] = y; num[y] += num[x]; } } } int main(){ int n, a, b; while (scanf("%d", &n)!=EOF){ { init(MAX); int max=1; while (n--){ scanf("%d%d", &a, &b); unite(a-1, b-1); } for (int i = 0; i < MAX; i++){ if (par[i] == i) max = ((max>num[i]) ? max : num[i]); } cout << max << endl; } } }
相关文章推荐
- 图dfs和bfs时的时间复杂度
- [三分]HDOJ 5531 Rebuild
- 关于在一定刀数内切一个圆的球,求出切出最多块数的值的数学推论 hdoj 1290
- 快速切分法寻找中位数的递归与非递归实现
- 在EA中将代码导入模型的时候,查看源码出现中文乱码的解决方案
- 第八周项目1—建立顺序串的算法库
- Android动画进阶—使用开源动画库nineoldandroids
- C语言中求字符串长度
- 【线性代数公开课MIT Linear Algebra】 实际应用——python中的线性代数(1)
- 乔迁
- YJQ Arranges Sequences
- HTML--【DRP】
- Java记录 -53- LinkedList实现队列
- elasticsearch 笔记-安装
- AE二次开发异常报错:异常来自 HRESULT:0x80040228
- 在Android Studio中创建项目和模拟器
- 闲聊
- linux 命令
- hdu 1495 非常可乐
- Nmap-服务探测