题目背景
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
题目描述
规定:𝑥 和 𝑦 是亲戚,𝑦 和 𝑧 是亲戚,那么 𝑥 和 𝑧 也是亲戚。如果 𝑥,𝑦 是亲戚,那么 𝑥 的亲戚都是 𝑦 的亲戚,𝑦 的亲戚也都是 𝑥 的亲戚。
输入格式
第一行:三个整数 𝑛,𝑚,𝑝(𝑛,𝑚,𝑝≤5000),分别表示有 𝑛 个人,𝑚 个亲戚关系,询问 𝑝 对亲戚关系。
以下 𝑚 行:每行两个数 𝑀𝑖,𝑀𝑗,1≤𝑀𝑖, 𝑀𝑗≤𝑛, 表示 𝑀𝑖 和 𝑀𝑗 具有亲戚关系。
接下来 𝑝 行:每行两个数 𝑃𝑖,𝑃𝑗,询问 𝑃𝑖 和 𝑃𝑗 是否具有亲戚关系。
输出格式
𝑝 行,每行一个 Yes 或 No。表示第 𝑖 个询问的答案为“具有”或“不具有”亲戚关系。
输入输出样例
输入
6 5 3 1 2 1 5 3 4 5 2 1 3 1 4 2 3 5 6输出
Yes Yes No
#include<bits/stdc++.h>
using namespace std;
int f[5010];
int fa(int x){
if(f[x]==0)return x;
if(f[x]==x)return x;
else return fa(f[x]);
}
int main(){
int n,m,p;
cin>>n>>m>>p;
while(m--){
int a,b;
cin>>a>>b;
//printf("%d %d \n",fa(a),fa(b));
f[fa(a)]=fa(b);
}
while(p--){
int a,b;
cin>>a>>b;
if(fa(a)==fa(b)){
cout<<"Yes\n";
}else{
cout<<"No\n";
}
}
}
1057

被折叠的 条评论
为什么被折叠?



