题目
题意:
给出n个人的亲戚关系,之后给出p对人,判断这两个人之间有没有亲属关系。
思路:
因为这是并查集的例题,所以这里用并查集,每次读入都让它们合并起来,可以压缩路径。
代码:
#include<cstdio>
int n,m,p,x,y,father[50001];
int find(int a)
{
if (father[a]!=a) father[a]=find(father[a]);
return father[a];
}
void unionn(int f1,int f2) {father[f2]=f1;}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for (int i=1;i<=n;i++)
father[i]=i;//刚开始自己为爸爸
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
int f1=find(x),f2=find(y);//找爸爸
if (f1!=f2) unionn(f1,f2);//合并
}
for (int i=1;i<=p;i++)
{
scanf("%d%d",&x,&y);
if (find(x)==find(y)) printf("Yes\n");
else printf("No\n");
}
}