并查集(思路二(按秩并))

 

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

输入格式

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

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

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

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

输出格式

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

输入输出样例

输入 #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

说明/提示

对于 100% 的数据,1≤N≤104,1≤M≤2×105,1≤Xi​,Yi​≤N,Zi​∈{1,2}。

#include 

using namespace std;

constexpr int N=1e6;
int fa[N];

int getf(int x){
    return x==fa[x] ? x:fa[x]=getf(fa[x]);
}
void unite(int x,int y){
    fa[getf(x)]= getf(y);
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
    while(m--) {
        int x, y, z;
        scanf("%d%d%d", &z, &x, &y);
        if (z == 1) {
            unite(x, y);
        }
        else {
            if(getf(x)==getf(y))
                printf("Y\n");
            else
                printf("N\n");
        }
    }
    return 0;
}

 

你可能感兴趣的:(算法)