AcWing 836. 合并集合(并查集)

作用:高效的合并两个集合和查询两个元素是否在同一个集合,时间复杂度近O(1);

原理:每个集合用一颗树来表示,树根的编号就是整个集合的编号,每个节点存储他的父节点。

#include
using namespace std;

const int N=100010;
int p[N];

int findd(int x){
	while(p[x]!=x){
		x=p[x];
	}
	return x;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)	p[i]=i;
	for(int i=1;i<=m;i++){
		int a,b;
		string s;
		cin>>s>>a>>b;
		if(s=="M"){
			p[findd(a)]=findd(b);
		}
		else{
			if(findd(a)==findd(b)){
				cout<<"Yes\n";
			}
			else{
				cout<<"No\n";
			}
		}
	}
	return 0;
}

你可能感兴趣的:(数据结构,算法,c++,数据结构)