1118 Birds in Forest(并查集)

这是一道模板题,要先记住大体流程,然后反复练习。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int father[10010];
 6 
 7 void init() {
 8     for(int i = 1; i <= 10010; ++i)
 9         father[i] = i;
10 }
11 
12 int findFather(int a) {
13     int b = a;
14     while(a != father[a])
15         a = father[a];
16     while(b != father[b]) { //路径压缩
17         int t = b;
18         b = father[b];
19         father[t] = a;
20     }
21     return a;
22 }
23 
24 void Union(int a,int b) {
25     int fa = findFather(a);
26     int fb = findFather(b);
27     if(fa != fb) father[fb] = fa;
28 }
29 
30 int main() {
31     init();//初始化 
32     int n,maxNum,a,b;
33     cin>>n;
34     while(n--) {
35         int k,flag = 1;
36         cin>>k;
37         for(int i = 0; i < k; ++i) {
38             cin>>a;
39             if(flag) b = a,flag = 0;
40             Union(a,b);
41             maxNum = max(maxNum,a);
42         }
43     }
44     int cnt = 0;
45     for(int i = 1; i <= maxNum; ++i)
46         if(father[i] == i) cnt++;
47     printf("%d %d\n",cnt,maxNum);
48     cin>>n;
49     while(n--) {
50         cin>>a>>b;
51         int fa = findFather(a);
52         int fb = findFather(b);
53         if(fa == fb) printf("Yes\n");
54         else printf("No\n");
55     }
56     return 0;
57 }

 

posted @ 2020-03-19 15:42  tangq123  阅读(184)  评论(0)    收藏  举报