题目
题解
定义:
并查集,我们通常是在开始时让每个元素构成一个单元素的集合,
然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。
若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;
即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)
内计算出试题需要的结果,只能用并查集来描述。
#include<bits/stdc++.h>
using namespace std;
int n,m,z,x,y,f[10005];
int find(int k){ //函数find,用来路径压缩
if(f[k]==k) return k;
return f[k]=find(f[k]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
f[i]=i; //初始化i的老大为自己
for(int i=1;i<=m;i++){
cin>>z>>x>>y;
if(z==1)
f[find(x)]=find(y); //将 X与 Y 所在的集合合并
else if(find(x)==find(y)) //判断 X与 Y是否在同一集合内
cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
return 0;
}
//注:f[k]:指k的上级 find(x):函数find,指找到x的上级 find(f[k]) 指找到k的上级的上级