大佬的题解用比喻用得实在是太通俗易懂了……
#include<stdio.h>
int f[10005];
int find(int t)//找t的老大
{
if(f[t]==t) return t;
//如果t的老大就是他自己,那么已经找到了顶头老大,返回
return f[t]=find(f[t]);
//如果t的上头还有老大,那么签订契约确认t的老大就是t的老大
//然后继续找t的老大的老大,一边找一边签订契约
}
int main()
{
int n,m,k,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&k,&x,&y);
if(k==1) f[find(x)]=find(y);
//合并x与y,不妨看作是x的老大认y的老大作老大
//从而,以x的老大为首的小弟都并入了y的组织
if(k==2){
if(find(x)==find(y)) printf("Y\n");
else printf("N\n");
}
}
return 0;
}