POJ1611 http://poj.org/problem?id=1611
题目大意:
给定0~n-1个学生,m个小组。
其中0号学生是 鸡你太美 病毒的感染者,和他在一个组的同学也会被他传染。问最后有多少个同学感染。
解题思路:
并查集,另外开一个数组用于储存在i号序列下挂载了多少个子个数。合并的时候将被合并的个数加到父亲节点的个数上即可。
AC代码:
#include <iostream>
using namespace std;
const int maxn = 30005;
int father[maxn];
int sum[maxn];
void init() {
for(int i = 0 ; i < maxn ; i++) {
father[i] = i;
sum[i] = 1;
}
}
int find(int x) {
return father[x] == x ? x : find(father[x]);
}
int check(int x,int y) {
return find(x) == find(y);
}
void unionn(int x,int y) {
int p1 = find(x),p2 = find(y);
if(p1==p2) return;
father[p1] = p2;
sum[p2] += sum[p1];
}
int k;
int tmp[30005];
int main() {
int a,b;
while(cin >> a >> b) {
int ans = 1;
if (a == 0 && b == 0) return 0;
else if (a != 0 && b == 0) cout << 1 << endl;
else {
init();
while(b--) {
int t,fi,se;
cin >> t;
cin >> fi;
t--;
while(t--) {
cin >> se;
unionn(fi,se);
}
}
cout << sum[find(0)] << endl;
// for(int q = 1 ;q < a;q++) {
// if(check(q,0)) ans++;
// }
// cout << ans << endl;
}
}
return 0;
}