当前位置:首页 > 题解目录 > 正文内容

【题解】亲戚

亿万年的星光3年前 (2023-03-30)题解目录3666


【题目描述】

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

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

【输入描述】

第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。
以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Mi和Mj具有亲戚关系。
接下来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

【题目分析】

并查集的模板题

【参考代码】

#include<bits/stdc++.h>
using namespace std;
int n,m,q,f[10010],x,y,a,b;
int find(int x)//找出某棵树的老大 
{
	if(f[x]==x)//x是x的老大,
		return x;
	else 
		return  f[x]=find(f[x]);//x不是他自己的老大,所以他上面还有老大,递归 
}
void merge(int x,int y)
{
	//先找到两个元素对应的根对应的元素 
	int fx = find(x); 
	int fy = find(y);
	if(fx==fy) return;
	else f[fy]=fx;  //否则令元素 x的根指向元素 y的根  
	return ;
}
int main()
{
	cin>>n>>m>>q; 
	//初始化每个人 
	for(int i=1;i<=n;i++)
		f[i]=i;
	//合并	
	for(int i=1;i<=m;i++)
	{
	     cin>>x>>y; 
	     merge(x,y);
	}
	//询问 
	for(int i=1;i<=q;i++)
	{
		cin>>a>>b; 
		if(find(a)==find(b)){
			//如果a所在子集的老大和b所在子集的老大一样,
			//那么可以判断出知a和b属于同一个集合
			cout<<"Yes"<<endl;
		}
		else{
			cout<<"No"<<endl; 
		}	
	}
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 并查集
分享给朋友:

相关文章

【题解】跳格子2

【题目描述】地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能...

【题解】报数游戏

【题目描述】路飞在和他朋友们一块玩一个游戏。由于路飞的机智,这个游戏由路飞担任裁判。首先,路飞会给他们一个人一个编号,并且每个人的编号都不相同。接下来的每一个回合,会给一个数,编号不超过它的最大编号的...

【题解】切割绳子

【题目描述】有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2位后的小数)。【输入描述】第一行两个整数N和K(0&l...

【题解】山区建小学

【题目描述】政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0<i<...

【题解】最长不下降子序列2

【题目描述】设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i1<i2<i3<…<ie 且有b...

【题解】修改回文

【题目描述】如果一个字符串,顺读与倒读的内容一样,称这个字符串为回文。例如 aka 是一个回文,noon 也是一个回文。给定一个字符串,请计算最少需要修改多少个字符,才能...