POJ 1611 (并查集)
来源:互联网 发布:秋天 知乎 编辑:程序博客网 时间:2024/05/13 14:24
题意:
有n个学生,编号0~n-1,现在有m个由学生组成的群体,群体里面有一个感染病的话
都感染,0是最初的感染源。
思路:
最开始以为直接Find()就行了,把每一个群体的第一个人当作father,但是发现这
样会重合,使得被0感染的并且在其它群体的人找不到,后来发现直接按照群体来合并
这样最后直接找0在哪一个群体就行了。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 30005;int n,m,k,fa;int f[MAXN];int num[MAXN];int Find(int x){ return x == f[x] ? x:f[x] = Find(f[x]);}void union_find(int x,int y){ int a = Find(x); int b = Find(y); if(num[a] > num[b]) { f[b] = a; num[a] += num[b]; } else { f[a] = b; if(num[b] > num[a]) num[b] += num[a]; }}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m) != EOF) { if(n == 0 && m == 0) break; for(int i = 0;i < n; i++) { num[i] = 1; f[i] = i; } for(int i = 0;i < m; i++) { scanf("%d",&k); if(k >= 1) scanf("%d",&fa); for(int j = 0;j < k-1; j++) { int temp; scanf("%d",&temp); union_find(fa,temp); } } int ans = 0; for(int i = 0;i < n; i++) { if(Find(i) == Find(0)) ans++; } printf("%d\n",ans); } return 0;}
0 0
- 并查集 POJ 1611
- 【并查集】POJ-1611
- poj 1611(并查集)
- poj 1611 并查集
- poj 1611 并查集
- 【POJ 1611 并查集】
- poj 1611 并查集
- poj 1611(并查集)
- poj-1611 并查集
- POJ 1611 并查集
- poj 1611 并查集
- POJ 1611 (并查集)
- POJ 1611 <并查集>
- poj 1611 并查集
- 并查集 POJ 1611
- POJ 1611 (并查集)
- Poj 并查集
- poj并查集
- vb.net 教程 3-4 窗体编程 公共控件1 Button、Label、TextBox & CheckBox
- 数据库分页
- Java导入静态方法到类中
- java 算法时间计算与优化方法
- 第七届蓝桥杯决赛 棋子换位
- POJ 1611 (并查集)
- c++关键字
- 将两个数组并为一个有序数组
- E Card Trick(队列)
- 在AppWeb后台,管理员所有数据已经录入完毕,但用手机浏览器登录评委打分界面,发现打分界面为空,或者选手人数不对等问题,如何解决?
- android——wifi系统架构(zt)
- PopupWindow 设置动画无效
- 项目部署的一些思考
- 算法--美团--给出m*n个格子,每次只能右走一步或下走一步,打印出所有的路径