洛谷P3367 【模板】并查集

并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。

接下来 M 行,每行包含三个整数 Zi​,Xi​,Yi​ 。

当Zi​=1 时,将 Xi​ 与 Yi​ 所在的集合合并。

当Zi​=2 时,输出 Xi​ 与 Yi​ 是否在同一集合内,是的输出 Y ;否则输出 N 。

输出格式

对于每一个 Zi​=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。

输入输出样例

输入 #1复制

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

输出 #1复制

N
Y
N
Y

说明/提示

对于 30%30% 的数据,N≤10,M≤20。

对于 70%70% 的数据,N≤100,M≤10^3。

对于 100%100% 的数据,1≤N≤10^4,1≤M≤2×10^5,1≤Xi​,Yi​≤N,Zi​∈{1,2}。

代码: 

#include <bits/stdc++.h>
using namespace std;
int n,m;
int anc[10010];//存每个人的祖先 
int find(int c){
	if(c!=anc[c]) anc[c]=find(anc[c]);//如果C的祖先不是他自己,找他祖先的祖先。 
	return anc[c];
}
int main(){
	cin >> n >> m;
	for(int i = 1;i<=n;i++){
		anc[i]=i;//每个人的祖先初始化为自己 
	}
	for(int i = 1;i<=m;i++){//m次操作 
		int z,x,y;
		cin >> z >> x >> y;
		if(z==1){//并 
			int t1=find(x),t2=find(y);
			if(t1!=t2) anc[t1]=t2;//如果x的祖先和y的祖先不一样,集合合并,x的祖先的祖先变为y的祖先 
		}else{//查 
			int t1=find(x),t2=find(y);
			if(t1==t2){//判断是否在一个集合内 
				cout << "Y\n";
			}else cout << "N\n";
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值