当前位置: 首页 > news >正文

洛谷 P3367 【模板】并查集 C++

题目背景

本题数据范围已经更新到 1≤N≤2×10 5 ,1≤M≤10 6 。

题目描述

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

输入格式

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

接下来 M 行,每行包含三个整数 Z i ​ ,X i ​ ,Y i ​ 。

当 Z i ​ =1 时,将 X i ​ 与 Y i ​ 所在的集合合并。

当 Z i ​ =2 时,输出 X i ​ 与 Y i ​ 是否在同一集合内,是的输出 Y ;否则输出 N 。

输出格式

对于每一个 Z i ​ =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

说明/提示

对于 15% 的数据,N≤10,M≤20。

对于 35% 的数据,N≤100,M≤10 3 。

对于 50% 的数据,1≤N≤10 4 ,1≤M≤2×10 5 。

对于 100% 的数据,1≤N≤2×10 5 ,1≤M≤10 6 ,1≤X i ​ ,Y i ​ ≤N,Z i ​ ∈{1,2}。

完整代码

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int fa[N];//并查集父节点数组,fa[i]表示i的父节点 
void init(int n)//初始化并查集,每个元素的父节点指向自己 
{
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
}
int find(int x)//带路径压缩的查找 
{
	if(x==fa[x])//找到根节点 
	{
		return x;
	}else{
		fa[x]=find(fa[x]);//路径压缩:将当前节点的父节点直接指向根 
		return fa[x];//返回根节点 
	}
}
void unionn(int i,int j)//合并 
{
	int i_fa=find(i);//找到i的根节点 
	int j_fa=find(j);//找到j的根节点 
	fa[i_fa]=j_fa;//将i的根节点指向j的根节点
}
int main()
{
	int n,m;
	cin>>n>>m;
	init(n);
	for(int i=1;i<=m;i++)
	{
		int z,x,y;
		cin>>z>>x>>y;
		if(z==1)
		{
			unionn(x,y);
		}else{
			if(find(x)==find(y))//判断是否属于同一集合 
			{
				cout<<"Y"<<endl;
			}else{
				cout<<"N"<<endl;
			}
		}
	}
	return 0;
}

相关文章:

  • [原创](Modern C++)现代C++的关键性概念: std::move()可以理解为把数据进行剪切再粘贴.
  • BGP路由协议之解决 IBGP 水平分割带来的问题
  • 【Tauri2】016——后端Invoke结构体和invoke_key
  • opus+ffmpeg+c++实现录音
  • Windwos的DNS解析命令nslookup
  • Linux系统的不同发行版的常用命令
  • 大储EMS能量管理系统解决方案:助力企业实现智慧能源转型
  • SSM框架相关面试题
  • Vue3实战七、登录认证与退出登录
  • Spring AOP 核心的技术之一:动态代理
  • 其他合成方式介绍
  • nacos集群部署
  • 【redis】summary
  • rust 同时处理多个异步任务,并在一个任务完成退出
  • PythonJSON解析如何优雅处理嵌套JSON字符串
  • springboot中使用async实现异步编程
  • Docker Compose 部署Nginx反向代理 tomcat
  • 每日算法-250407
  • 数字经济产业标杆:树莓集团如何塑造产业服务价值体系
  • 没有独立显卡如何安装torch
  • 终于,俄罗斯和乌克兰谈上了
  • 中方是否计划解除或调整稀土出口管制?外交部回应
  • 上海市重大工程一季度开局良好,多项生态类项目按计划实施
  • 美政府以拨款为要挟胁迫各州服从移民政策,20个州联合起诉
  • 水豚“豆包”出逃已40天,扬州茱萸湾景区追加悬赏
  • 专访|西蒙·斯特朗格:以“辞典”的方式讲述二战家族史