16th 【并查集】亲属关系

该博客讨论了如何在大型家族中通过并查集数据结构有效地判断两个人是否存在亲戚关系。题目描述指出,如果x和y是亲戚,y和z也是亲戚,那么x和z也是亲戚。输入包括人员数量、亲戚关系数量和询问的亲戚关系对,输出是对每个询问的'Yes'或'No'回答。博客内容提到了时间限制和数据范围,并强调了并查集在解决此类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                      亲属关系

【题目描述】:

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。

【输入描述】:

第一行:三个整数n,m,p,分别表示有n个人,m个亲戚关系,询问p对亲戚关系。

以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。

接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。

【输出描述】:

P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。

【样例输入】:

6 5 3 
1 2 
1 5 
3 4 
5 2 
1 3 
1 4 
2 3 
5 6 

【样例输出】:

Yes 
Yes 
No

【时间限制、数据范围及描述】:

时间:1s 空间:128M

n<=5000,m<=5000,p<=5000


并查集的运用


#include<iostream>  
#include<cstdio>  
#include<cstdlib>  
#include<algorithm>  
#include<cstring>  
using namespace std;  
int n,m,p;
int f[5005]; 
int find(int x)  
{return x==f[x]?x:f[x]=find(f[x]);}
  
int main()  
{  
    //freopen("relation.in","r",stdin);  
   // freopen("relation.out","w",stdout);  
	 cin>>n>>m>>p;
     for(int i=1;i<=n;i++)   f[i]=i;
     int a,b;
     for(int i=1;i<=m;i++)
    { cin>>a>>b;
	  int q=find(a);
	  int p=find(b);
	  f[q]=p; 
	 }
	 for(int i=1;i<=p;i++)
	 {   cin>>a>>b; 
	     if(find(a)==find(b))
         cout<<"Yes"<<endl;
		 else
		 cout<<"No"<<endl;	 }
    return 0;  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值