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 }


浙公网安备 33010602011771号