家族查询

Time Limit: 1sec    Memory Limit:256MB
Description

某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。(人数≤5000,询问亲戚关系次数≤5000)。

Input

第一行为数据组数T(T <= 20)

对于每组数据,第一行有两个整数n、m(1 <= n, m <= 5000),表示有n个人,编号1~n,其中存在m个亲戚关系

接下来m行,每行有两个整数u、v(u != v, 1 <= u, v <= n),表示u和v之间有亲戚关系

然后是询问组数q(1 <= q <= 5000)

接下来q行,每行有两个整数u、v(u != v, 1 <= u, v <= n),询问u和v之间是否有亲戚关系

 

Output
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>

using namespace std;

int father[50002],a,b,m,n,p;


//找到x的祖先 
int find(int x){
	if(father{x} != x){
		father[x] = find(father[x]);
		return father[x];
	}
} 


int main(){
	int q;
	cin>>q;
	while(q--){
		
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			father[i] = i;
		}
		
		for(int i=1;i<=m;i++){
			cin>>a>>b;
			a = find(a);
			b = find(b);
			father[a] = b;
		}
		
		cin>>p;
		for(int i=1;i<=p;i++){
			cin>>a>>b;
			a = find(a);
			b = find(b);
			if(a == b){
				cout<<"Yes"<<endl; 
			}
			else cout<<"No"<<endl;
		}
		if(q != 0){
			cout<<endl; 
		}
	}
	return 0;
}


对于每组数据,输出q行,每行为"Yes"或"No",表示是否存在亲戚关系

每组数据的输出用空行隔开



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值