Luogu [P3367] 模板 并查集
2024-08-29 13:37:06
【模板】并查集
题目详见:[【P3367】【模板】并查集] (https://www.luogu.org/problemnew/show/P3367)
这是一道裸的并查集题目(要不然叫模板呢) 废话不多说进入正题:
并查集通过一个一维数组来实现,本质上是维护一个森林。刚开始的时候,森林里的每一个结点都是一个集合(也就是只有一个结点的树),之后根据题意,逐渐将一个个集合合并(也就是合并成一棵大树)。之后寻找时不断查找父节点,当查找到父结点为本身的结点时,这个结点就是祖宗结点。合并则是寻找这两个结点的祖宗结点,如果这两个结点不相同,则任意将其中一边的集合作为另一边集合的子集。
AC代码:
#include<iostream>
using namespace std;
int n/*n个元素*/,m/*m个操作*/,f[]/*第i个人的祖宗为f[i]*/;
int find(int x) //找祖宗(※※重点)
{
if(f[x]==x) //若自己的祖宗为自己
return f[x];
else
return f[x]=find(f[x]);//路径压缩(※※难点):把递归过程中遇到的结点的祖宗结点也直接修改了
}
void hebing(int x,int y) //合并操作
{
int fx=find(x),fy=find(y);
if(fx!=fy) //(其实这一步可有可无,因为之前已经判断过了)
f[fx]=fy; //x的祖宗 的父亲 为y的祖宗
return;
}
int main()
{
cin>>n>>m; //读入
for(int i=;i<=n;i++)
f[i]=i; //初始化:n个数,每个数祖宗为自己
for(int i=;i<=m;i++) //依次读入m个操作要求
{
int z,x,y;
cin>>z>>x>>y;
if(z==) //执行查询操作
{
if(find(x)==find(y)) //如果两个人为同一个祖宗,则在一个集合 (※※重点)
cout<<"Y"<<endl;
else //否则不在一个集合
cout<<"N"<<endl;
}
else //执行合并操作
hebing(x,y);
}
return ;
}
最新文章
- Exception Handling引入MVP
- Rest.Ler PHP API Server解决方案
- WcfDataService with EntityFramework 6 的若干问题
- 【HDU 5750】Dertouzos(数学)
- NOI模拟赛Day4
- 《Programming with Objective-C》第三章 Working with Objects
- 新闻客户端nices
- 利用MutationObserver对页面元素的改变进行监听
- slf4j简介
- wchar_t 、UTF-8、UTF-16的转换方法 - luketty的专栏 - 博客频道 - CSDN.NET
- JAVA基本的编程50称号(7-9称号)详细解释
- C#实现函数根据返回类型重载
- 用user-selection实现让页面上的内容不能被选中
- 洛谷P4723 【模板】线性递推(多项式取模 线性代数)
- django----基于Form组件实现的增删改和基于ModelForm实现的增删改
- Unity中InitializeOnLoad属性的妙用
- 通过父元素的hover控制子元素的显示
- webpack导入css及各项loader
- Python 文件操作一
- 《转》python学习(9)字典
热门文章
- PHP json 对象 数组互相转换
- 51nod1100(计算斜率)
- hiho week 136(二分+优先队列)
- loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】
- jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)
- uoj#38. 【清华集训2014】奇数国(线段树+数论)
- ios Realm的使用 本地数据存储
- 解决IE6 IE7绝对定位弹层被后面的元素遮住
- python进阶06 常用问题库(2)datetime模块 base64
- .net core实现的全程序跟踪