标签:des style blog http color strong
Time Limit: 1000MS | Memory Limit: 20000K | |
Total Submissions: 21472 | Accepted: 10393 |
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
Source
1 int ufs[MAXN]; //并查集
2
3 void Init(int n) //初始化
4 {
5 int i;
6 for(i=0;i<n;i++){
7 ufs[i] = i;
8 }
9 }
10
11 int GetRoot(int a) //获得a的根节点。路径压缩
12 {
13 if(ufs[a]!=a){ //没找到根节点
14 ufs[a] = GetRoot(ufs[a]);
15 }
16 return ufs[a];
17 }
18
19 void Merge(int a,int b) //合并a和b的集合
20 {
21 ufs[GetRoot(b)] = GetRoot(a);
22 }
23
24 bool Query(int a,int b) //查询a和b是否在同一集合
25 {
26 return GetRoot(a)==GetRoot(b);
27 }
1 #include <iostream>
2 #include <stdio.h>
3 using namespace std;
4 #define MAXN 30010
5 int sum[MAXN]; //集合总数
6 int ufs[MAXN]; //并查集
7
8 void Init(int n) //初始化
9 {
10 int i;
11 for(i=0;i<n;i++){
12 ufs[i] = i;
13 sum[i] = 1;
14 }
15 }
16
17 int GetRoot(int a) //获得a的根节点。路径压缩
18 {
19 if(ufs[a]!=a){ //没找到根节点
20 ufs[a] = GetRoot(ufs[a]);
21 }
22 return ufs[a];
23 }
24
25 void Merge(int a,int b) //合并a和b的集合
26 {
27 int x = GetRoot(a);
28 int y = GetRoot(b);
29 if(x!=y){
30 ufs[y] = x;
31 sum[x] += sum[y];
32 }
33 }
34
35 int main()
36 {
37 int n,m;
38 while(scanf("%d%d",&n,&m)!=EOF){
39 if(n==0 && m==0) break;
40 Init(n); //初始化并查集
41 while(m--){ //读入m行
42 int t,one,two;
43 scanf("%d",&t); //每一行有t个数需要输入
44 scanf("%d",&one);
45 t--;
46 while(t--){
47 scanf("%d",&two);
48 Merge(one,two); //合并集合
49 }
50 }
51 printf("%d\n",sum[GetRoot(0)]);
52 }
53 return 0;
54 }
Freecode : www.cnblogs.com/yym2013
poj 1611:The Suspects(并查集,经典题),布布扣,bubuko.com
poj 1611:The Suspects(并查集,经典题)
标签:des style blog http color strong
原文地址:http://www.cnblogs.com/yym2013/p/3845448.html