【模板】并查集

题目详见:[【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 ;
}

最新文章

  1. Exception Handling引入MVP
  2. Rest.Ler PHP API Server解决方案
  3. WcfDataService with EntityFramework 6 的若干问题
  4. 【HDU 5750】Dertouzos(数学)
  5. NOI模拟赛Day4
  6. 《Programming with Objective-C》第三章 Working with Objects
  7. 新闻客户端nices
  8. 利用MutationObserver对页面元素的改变进行监听
  9. slf4j简介
  10. wchar_t 、UTF-8、UTF-16的转换方法 - luketty的专栏 - 博客频道 - CSDN.NET
  11. JAVA基本的编程50称号(7-9称号)详细解释
  12. C#实现函数根据返回类型重载
  13. 用user-selection实现让页面上的内容不能被选中
  14. 洛谷P4723 【模板】线性递推(多项式取模 线性代数)
  15. django----基于Form组件实现的增删改和基于ModelForm实现的增删改
  16. Unity中InitializeOnLoad属性的妙用
  17. 通过父元素的hover控制子元素的显示
  18. webpack导入css及各项loader
  19. Python 文件操作一
  20. 《转》python学习(9)字典

热门文章

  1. PHP json 对象 数组互相转换
  2. 51nod1100(计算斜率)
  3. hiho week 136(二分+优先队列)
  4. loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】
  5. jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)
  6. uoj#38. 【清华集训2014】奇数国(线段树+数论)
  7. ios Realm的使用 本地数据存储
  8. 解决IE6 IE7绝对定位弹层被后面的元素遮住
  9. python进阶06 常用问题库(2)datetime模块 base64
  10. .net core实现的全程序跟踪