☘前言☘
今日份水题开始。希望有想要提高的同学跟我们一起来刷题0.0
4.11日每日一题——亲戚
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 20min
解题思路
挺好的题目,本来没看过并查集的概念,这次了解了一下,其实思路就是每个节点都保存自己的最祖先的那个,如果最终两个祖先相同就直接返回Yes,否则就是No,然后其实每个节点保存自己的
最祖先的
那个节点信息就好了,所以在查找祖先的时候可以把数组中的元素直接标记加速。
#include <stdio.h>
int f[5010];
int Find(int x){
if(f[x] == x) return x;
else return f[x] = Find(f[x]);
}
int main(){
int m,n,k;
scanf("%d %d %d",&m,&n,&k);
for(int i = 1;i<= m;++i) f[i] = i; //指向自己
while(n--){
int o,k;
scanf("%d %d",&o, &k);
f[Find(o)] = Find(k);//合并两个并查集
}
while(k--){
int o,k;
scanf("%d %d",&o, &k);
Find(o) == Find(k) ? printf("Yes\n") : printf("No\n");
}
return 0;
}
📑写在最后
今天就这样,明日再见0.0