嗯...
题目链接:https://www.luogu.org/problemnew/show/P1551
思路:
很显然地我们会发现,这是一道并查集的模板题,并且是考察了并查集中的”并“和”查“的操作(好像所有关于亲戚的题都与并查集有关...
然后就是一个并查集的模板了,可以尝试记住(亏自己先会了最小生成树...
AC代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 int f[10000005]; 7 int a, b, c, d; 8 9 inline int find(int x){ 10 if(f[x] != x) 11 f[x] = find(f[x]); 12 return f[x]; 13 } //“查”操作 14 int main(){ 15 int n, m, p; 16 scanf("%d%d%d", &n, &m, &p); 17 for(int i = 1; i <= n; i++) 18 f[i] = i; 19 for(int i = 1; i <= m; i++){ 20 scanf("%d%d", &a, &b); 21 int r1 = find(a); 22 int r2 = find(b); 23 if(r1 != r2) 24 f[r1] = r2; //“并”操作 25 } 26 for(int i = 1; i <= p; i++){ 27 scanf("%d%d", &c, &d); 28 int f1 = find(c); 29 int f2 = find(d); 30 if(f1 == f2) printf("Yes\n"); 31 else printf("No\n"); 32 } 33 return 0; 34 }