POJ 1661(带权并查集模板)
- 带权并查集模板
- 并查集+统计一个点集的大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39#include <iostream>
using namespace std;
const int maxn = 3e4+10;
int n,m;
int prv[maxn];
int tot[maxn]; // tot记录以点i作为顶点的个数
int find(int x) {
if ( prv[x] == x ) return x;
return prv[x] = find(prv[x]);
}
void merge(int a,int b) {
int p1 = find(a);
int p2 = find(b);
if ( p1==p2 ) return ;
prv[p2] = p1;
tot[p1] += tot[p2];
}
void init(int n) {
for (int i=0; i<n; i++)
prv[i] = i,tot[i] = 1;
}
int main() {
// freopen("a.txt","r",stdin);
while ( scanf("%d%d",&n,&m) ) {
if ( n==0 && m==0 ) break;
init(n);
for (int i=0 ; i<m; i++) {
int cur,k;
scanf("%d%d",&k,&cur);
for (int j=1; j<k; j++) {
int v;
scanf("%d",&v);
merge(cur,v);
}
}
printf("%d\n", tot[find(0)] );
}
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!