并查集

P3367 【模板】并查集

题目背景

本题数据范围已经更新到 1\le N\le 2\times 10^51\le M\le 10^6

题目描述

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

输入格式

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

接下来 M 行,每行包含三个整数 Z_i,X_i,Y_i

Z_i=1 时,将 X_iY_i 所在的集合合并。

Z_i=2 时,输出 X_iY_i 是否在同一集合内,是的输出Y ;否则输出 N

输出格式

对于每一个 Z_i=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


说明/提示

对于 15\% 的数据,N \le 10M \le 20

对于 35\% 的数据,N \le 100M \le 10^3

对于 50\% 的数据,1\le N \le 10^41\le M \le 2\times 10^5

对于 100\% 的数据,1\le N\le 2\times 10^51\le M\le 10^61 \le X_i, Y_i \le NZ_i \in \{ 1, 2 \}

题解

代码

#include<stdio.h>
int arr[200005],high[200005];
int n,t,z,x,y;

int find(int x){
    return x==arr[x] ? x: find(arr[x]);
}
void con(int x,int y){
    x=find(x);
    y=find(y);
    if (high[x]==high[y]){
        arr[x]=arr[y];
        high[y]+=1;

    }
    else{
        if (high[x]>high[y]) arr[y]=arr[x];
        else      arr[x]=arr[y];
    }
}
int main(){
    scanf("%d %d",&n,&t) ;
    for (int i=1 ;i<n+1;i++){
        arr[i]=i;
        high[i]=0;
    }
    while (t--)
    {
        scanf("%d %d %d",&z,&x,&y);
        if (z==1){
            con(x,y);
        }
        else{
            if (find(x)!=find(y)){
                printf("N\n");
            }
            else{printf("Y\n");}
        }
    }
    return 0;
}

解析

这是并查集模板题,主要是合并和查询,一开始没有优化,超时了,后面加了合并优化通过了

全部评论

相关推荐

Edgestr:没项目地址就干脆把那一栏删了呗
点赞 评论 收藏
分享
Cl_Wg:看牛客匿名贴容易抑郁,白菜就是我的天花板
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务