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

算法学习——并查集

扁平化,小挂大~

1.头文件和定义

#include<iostream> #include<stack> //使用栈实现路径压缩 using namespace std; const int N = 2e5 + 10; int father[N]; // 父节点数组,father[i]表示i的父节点 int siz[N]; // 集合大小数组,siz[i]表示以i为根的集合大小 int n, m; // n:元素个数,m:操作次数

2.初始化

void build() { for (int i = 1;i <= n;i++) // 遍历所有元素 { father[i] = i; // 每个元素的父节点初始化为自己 siz[i] = 1; // 每个集合初始大小为1 } }

3.查找

int find(int i) { stack <int> st; // 创建栈,存储路径上的节点 // 第一步:找到根节点,同时记录路径 while (i != father[i]) // 当i不是自己的父节点(不是根) { st.push(i); // 将当前节点压入栈 i = father[i]; // 向上移动到父节点 } // 此时i是根节点 // 第二步:路径压缩(扁平化) while (!st.empty()) // 当栈不为空 { int t = st.top(); // 取出栈顶节点 father[t] = i; // 将该节点的父节点直接指向根节点 st.pop(); // 弹出栈顶 } return i; // 返回根节点 }

4.判断是否在同一集合

bool is_same_set(int x, int y) { return find(x) == find(y); // 比较两个元素的根节点是否相同 }

5.合并

bool Union(int x, int y) { int fx = find(x); // 找到x的根 int fy = find(y); // 找到y的根 if (fx != fy) // 如果不在同一集合 { // 小挂大(按秩合并) if (siz[fx] > siz[fy]) // 如果fx的集合更大 { father[fy] = fx; // 将fy挂到fx下 siz[fx] += siz[fy]; // 更新fx的大小 } else // 如果fy的集合更大或相等 { father[fy] = fx; siz[fy] += siz[fx]; } return true; // 合并成功 } else return false; // 已经在同一集合,无需合并 }

6.主函数

int main() { cin >> n >> m; // 读取元素个数和操作次数 build(); // 初始化并查集 while (m--) // 处理m个操作 { int opt = 0; cin >> opt; // 操作类型:1-合并,2-查询 int x = 0, y = 0; cin >> x >> y; // 读取两个元素 if (opt == 1) // 合并操作 Union(x, y); if (opt == 2) // 查询操作 { if (is_same_set(x, y)) cout << "Y" << endl; // 在同一集合 else cout << "N" << endl; // 不在同一集合 } } return 0; }

P3367 【模板】并查集

题目背景

本题数据范围已经更新到 1≤N≤2×105,1≤M≤106。

题目描述

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

输入格式

第一行包含两个整数 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

说明/提示

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

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

对于 50% 的数据,1≤N≤104,1≤M≤2×105。

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

#include<iostream> #include<stack> using namespace std; const int N = 2e5 + 10; int father[N]; int siz[N]; int n, m; void build() { for (int i = 1;i <= n;i++) { father[i] = i; siz[i] = 1; } } int find(int i) { stack <int> st; //扁平化 while (i != father[i]) { st.push(i); i = father[i]; } while (!st.empty()) { int t = st.top(); father[t] = i; st.pop(); } return i; } bool is_same_set(int x, int y) { return find(x) == find(y); } bool Union(int x, int y) { int fx = find(x); int fy = find(y); if (fx != fy) { //小挂大 if (siz[fx] > siz[fy]) { father[fy] = fx; siz[fx] += siz[fy]; } else { father[fy] = fx; siz[fy] += siz[fx]; } return true; } else return false; } int main() { cin >> n >> m; build(); while (m--) { int opt = 0; cin >> opt; int x = 0, y = 0; cin >> x >> y; if (opt == 1) Union(x, y); if (opt == 2) { if (is_same_set(x, y)) cout << "Y" << endl; else cout << "N" << endl; } } return 0; }
http://www.jsqmd.com/news/399544/

相关文章:

  • django漫画插画管理系统
  • django基于大数据爬虫+Hadoop+天气预报广西气温数据分析与可视化系统
  • django基于大数据爬虫+Hadoop+Python的股票指数基金数据分析与预测系统设计与实现
  • 当AI学会“搜论文“,传统搜索算法反而赢了?——SAGE基准测试揭示的反直觉发现
  • 大数据领域Doris的数据质量管控方法
  • Hadoop:大数据时代的基石,从核心架构到现代生态全景解析
  • MiniCPM-SALA:让Transformer在百万token下跑起来
  • AI原生应用领域链式思考:技术与思维的融合
  • 2025年终总结:山登有尽时,我心向何方
  • AI应用架构师如何设计安全的智能虚拟互动系统?
  • django基于大数据+Hadoop+酒店能耗大数据可视化系统
  • Django基于大数据+Hadoop的大学生就业 职业方向推荐系统的设计与实现
  • django基于大数据+Hadoop+深度学习的股票预测系统
  • DemoFX app中文版正式发布
  • django基于大数据+Hadoop+大数据的学生压力与心理状况分析及可视化系统
  • django基于大数据+Hadoop+大数据的森林病虫害智能预警与防控系统django5fa
  • django基于大数据+Hadoop+机器学习的空气PM2.5浓度预测系统
  • php方案 Redis Sentinel故障转移
  • 【Demo】✋ 数字手势识别 Html
  • 【全局敏感性分析】对使用SWAT的高参数化模型,PAWN与Sobol敏感性分析方法的比较研究附Matlab代码
  • [特殊字符] 龙魂系统第三层:边界、自检、护栏机制
  • django.基于大数据+Hadoop的大数据的电力消耗智能分析与预测平台
  • django基于大数据+Hadoop+Python的软件漏洞风险预警管理系统
  • django基于大数据+Hadoop+大数据的保险行业客户数据分析与可视化
  • django基于人脸识别的门禁管理系统
  • django基于基于大数据爬虫+Hadoop+Python的情人节鲜花销售分析预测可视化平台
  • django.基于基于大数据+Hadoop+深度学习方法的田间杂草识别系统
  • django基于大数据+Hadoop+Python的旅游景点门票预约与在线支付系统的设计与实
  • django基于基于大数据+Hadoop+Spark的青少年饮食习惯数据分析与可视化平台
  • django基于基于大数据+Hadoop+深度学习的海洋生物识别系统的设计与实现dj