并查集。。

【图论——并查集(详细版)】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; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值