循环+路径压缩

int n,m,z,x,y,fa[10005];

int find(int x) 
{
    if (x==fa[x]) return x;
    return fa[x]=find(fa[x]);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    	fa[i]=i;
    while(m--)
    {
        cin>>z>>x>>y;
        int a=find(x),b=find(y); //ab分别去找自己的爹
        if(z==1) fa[a]=b; //并查集的合并操作,及将x点祖先的爹记为y点的祖先
        if(z==2)
        {
            if(a==b) cout<<'Y'<<endl;
            else cout<<'N'<<endl;
        } 
    }
    return 0;
}