P3367 【模板】并查集

P3367 【模板】并查集

题目背景

自 2025 年 1 月 21 日,本题测试数据范围更新,详见:https://www.luogu.com.cn/discuss/1045596

这意味着现存题解的代码可能无法通过本题,管理组将会在 2025 年 2 月处理。

题目描述

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

输入格式

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

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

Zi=1 时,将 XiYi 所在的集合合并。

Zi=2 时,输出 XiYi 是否在同一集合内,是的输出
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

说明/提示

对于 15% 的数据,N10M20

对于 35% 的数据,N100M103

对于 50% 的数据,1N1041M2×105

对于 100% 的数据,1N2×1051M1061Xi,YiNZi{1,2}

#include<iostream>
using namespace std;
const int N=2*1e5+5;
int f[N];
int n,m;
void init(){
    for(int i=1;i<=n;i++)f[i]=i;
}
int find(int x){
    if(x!=f[x])return f[x]=find(f[x]);
    return f[x];
}
void merge(int x,int y){
    f[find(x)]=find(y);//查询时顺带压缩路径
}
int main(){
    cin>>n>>m;
    init();
    while(m--){
        int z,x,y;
        cin>>z>>x>>y;
        if(z==1)merge(x,y);
        if(z==2){
            int root1=find(x);
            int root2=find(y);
            if(root1==root2)cout<<"Y"<<endl;
            else cout<<"N"<<endl;
        }
    }
    return 0;
}
posted @   郭轩均  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示