今日题目:亲戚
1.题目要求
规定:xx 和 yy 是亲戚,yy 和 zz 是亲戚,那么 xx 和 zz 也是亲戚。如果 xx,yy 是亲戚,那么 xx 的亲戚都是 yy 的亲戚,yy 的亲戚也都是 xx 的亲戚。
输入格式
第一行:三个整数 n,m,p(n,m,p≤5000),分别表示有 n 个人,m 个亲戚关系,询问 p 对亲戚关系。
以下 m 行:每行两个数 Mi,Mj,N1≤Mi, Mj≤N,表示Mi 和 Mj 具有亲戚关系。
接下来 p 行:每行两个数 Pi,Pj,询问 Pi 和 Pj 是否具有亲戚关系。
输出格式
p 行,每行一个 Yes 或 No。表示第 i 个询问的答案为“具有”或“不具有”亲戚关系。
2.题目分析
题目难度:⭐️
题目涉及算法:并查集。
ps:有能力的小伙伴可以尝试优化自己的代码或者一题多解,这样能综合提升自己的算法能力
题解报告:
1.思路
这道题基本就是并查集模板了,初始化完成之后把亲戚合并,之后循环p次寻找关系。
2.代码
#include<bits/stdc++.h> using namespace std; const int N = 10001; int pre[N]; bool vis[N]; int find(int x) { if(x!=pre[x]) { return pre[x] = find(pre[x]); } return x; } void join(int x,int y) { int xx = find(x); int yy = find(y); if(xx!=yy) { pre[yy] = xx; } } int main() { int n,m,p,x,y; cin>>n>>m>>p; int z,j; for(int i=1;i<=n;i++) { pre[i] = i; } for(int i=1;i<=m;i++) { cin>>x>>y; join(x,y); } for(int i=1;i<=p;i++) { cin>>z>>j; if(find(z)==find(j)) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } return 0; }