acwing836合并集合,并查集(模板题)

并查集主要处理:1.集合合并    2.查找两元素是否在同一集合
优雅地合并+压缩路径
int find(int a){//合并+压缩路径
	if(fa[a]!=a) fa[a]=find(fa[a]);
	return fa[a];
}
代码
#include <bits/stdc++.h>
using namespace std;

int n,m,a,b;
char op[5];
const int N=100005;
int fa[N];

int find(int a){
	if(fa[a]!=a) fa[a]=find(fa[a]);
	return fa[a];
}
int main(int argc, char** argv) {
	cin>>n>>m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		scanf("%s%d%d",op,&a,&b);
		if(op[0]=='M') fa[find(a)]=fa[find(b)];//合并
		else printf("%s\n",find(a)==find(b)?"Yes":"No");//两个元素是否在同一集合
	}
	return 0;
}

全部评论

相关推荐

三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务