【图论——并查集(详细版)】https://www.bilibili.com/video/BV1jv411a7LK?p=2&vd_source=c77ad85b66b816360dc7f40c1ac06eb8
找祖宗,先让每个人当自己的祖宗,然后用find函数找祖宗,(可以这么理解,左右两列,左边为右边的祖宗,更方便一点)
#include<cstdio>
#include<cstdlib>
using namespace std;
#define MAXN 20001
int fa[MAXN];
void init(int n)
{
for(int i=1;i<=n;i++)//每个人都初始化设置自己为自己的亲戚
fa[i]=i;
}
int find(int x)//压缩后的查找函数
{
if(x==fa[x]) //如果这个人和自己互为亲戚,则返回值为亲戚的编号
return x;
else
{
fa[x]=find(fa[x]);如果这个人和自己不互为亲戚,
//则递归继续查找,并且找到后,直接将这个人与找到的最终亲戚建立关系
//下次使用就不需要重复递归遍历
return fa[x];
}
}
void unionn(int i,int j)//将两个人建立亲戚关系的函数
{
int i_fa =find(i);//i的最终亲戚
int j_fa =find(j); //j的最终亲戚
fa[i_fa]=j_fa;//将i的指向j
}
int main()
{
int n,m,x,y,q;
scanf("%d",&n);//输入人数 n
init(n);//初始化
scanf("%d",&m);//需要建立的关系次数m
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);//声明谁和谁是亲戚关系
unionn(x,y);
}
scanf("%d",&q);//查询次数q
for(int i=1;i<=q;i++)
{
scanf("%d%d",&x,&y);//要查询两人的编号
if(find(x)==find(y))//判断两人是否为亲戚函数
printf("YES\n");
else
printf("NO\n");
}
return 0;
}