这是一道并查集的板子题,其中给定族谱对应的是并查集的merge操作,查询x,y是否是亲戚对应的是并查集的查询操作
附AC代码
#include<cstdio>
#include<iostream>
using namespace std;
int f[5005],n,m,k;
int find(int a)
{
if(f[a]==a) return f[a];
return f[a]=find(f[a]);
}
void merge(int a,int b)
{
f[a]=b;
return;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int f1=find(x);
int f2=find(y);
if(f1==f2) continue;
else merge(f1,f2);
}
for(int i=1;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int f1=find(x);
int f2=find(y);
if(f1==f2) printf("Yes\n");
else printf("No\n");
}
return 0;
}