手打并查集

#include<iostream>
#include<stdio.h>
using namespace std;
struct bcj{
	int f[100010],n;
	void memsets(){
		for (int i=1;i<=n;i++){
			f[i]=i;
		}
	}
	int get(int p){//从p出发 最后会走到哪里
		if (f[p]==p) return p;
		else return f[p]=get(f[p]);
	}
	void merge(int p1,int p2){//把p1p2并在一起
		int f1=get(p1);
		int f2=get(p2);
		f[f1]=f2;
	}
	bool query(int p1,int p2){//询问p1p2是否在一起
		return get(p1)==get(p2);
	}
};
bcj z;
int read(){
	int x=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9'){
		if (c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9'){
		x=x*10+(c-'0');
		c=getchar();
	}
	return x*f;
}
int main(){
	z.n=read();
	int m;
	m=read();
	z.memsets();
	for (int i=1;i<=m;i++){
		int op;
		op=read();
		if (op==1){
			int x;
			x=read();
			printf("%d\n",z.get(x));
		}
		if (op==2){
			int x,y;
			x=read();
			y=read();
			z.merge(x,y);
		}
		if (op==3){
			int x,y;
			x=read();
			y=read();
			int o=z.query(x,y);
			if (o==true){
				printf("true\n");
			}
			else{
				printf("false\n");
			}
		}
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值