来自洛谷的板子
首先是find函数
int find(int k){
if(f[k]==k) return k;
return f[k]=find(f[k]);
}
找到每个集合的老大.
合并的操作
f[find(p2)]=find(p3);
然后判断不能只用数组判断,由于路径压缩的问题数组不能完全代表它的老大.
完整代码:
#include<iostream>
#include<cstdio>
using namespace std;
int f[10010];
int find(int k){
if(f[k]==k) return k;
return f[k]=find(f[k]);
}
int main(){ int i,j,k,n,m,p1,p2,p3;
cin>>n>>m;
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=m;i++){
scanf("%d%d%d",&p1,&p2,&p3);
if(p1==1){
f[find(p2)]=find(p3);
}
else {
if( find(p2)==find(p3) ) cout<<'Y'<<endl;
else cout<<'N'<<endl;
}
}
return 0;}