【模板】并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 N,M ,表示共有 N 个元素和 M个操作。

接下来 $M$ 行,每行包含三个整数 Zi,Xi,Yi 。

当 Zi=1 时,将 Xi 与 Yi 所在的集合合并。

当 Zi=2 时,输出 Xi 与 Yi 是否在同一集合内,是的输出
Y ;否则输出 N

输出格式

对于每一个 Zi=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N

样例 #1

样例输入 #1

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

样例输出 #1

N
Y
N
Y

代码示例

#include<iostream>
using namespace std;
const int N=1e6+10;
int p[N];
int n,m;
int find(int x)//返回x的祖宗结点+路径压缩
{
    if(p[x]!=x) p[x]=find(p[x]);//如果x不是根节点,将X的父节点更新等于祖宗结点·
    return p[x];//返回父节点
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    p[i]=i;
    while(m--)
    {
        int z,x,y;
        scanf("%d%d%d",&z,&x,&y);
        if(z==1) p[find(x)]=find(y);
        else
        {
            if(find(x)==find(y)) puts("Y");//两个祖宗一样说明在一个集合里
            else puts("N");//否则不在一个集合里
        }
    }
    return 0;
}
posted @ 2024-11-24 22:58  洋洋萱  阅读(80)  评论(0)    收藏  举报