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

合并集合(并查集)

并查集

并查集可以快速实现( 时间复杂度近乎 O(1) ):
1.将两个集合合并
2.判断两个元素是否在一个集合中
基本原理:每个集合用一棵树来表示,树根的编号就是这个集合的编号,每个节点存储自身的父节点,用p[x]表示 x 节点的父节点,当p[x]= x时,表示这个结点为根节点。在进行合并操作时,只需要把其中一棵树变成另一棵树的子树即可,即两个树根节点分别是 p[x] =x 和 p[y] =y; 我们只需要将 p[y] =x 即可。

路径压缩优化:在进行结点查找根节点的操作后,直接把这个这个结点的路径上的所有结点的父节点直接指向根节点,下次再查询这些结点时时间复杂度就变成O(1)了。

例题:

image-20250906214753577

输入样例:

4 5
M 1 2
M 3 4 
Q 1 2
Q 1 3
Q 3 4

预期输出:

Yes
No
Yes

代码实现:

#include<bits/stdc++.h>
using namespace std;const int N =1e5+10;int p[N];int find (int x )
{if (p[x] != x ) p[x] =find(p[x]); //路径压缩优化,将该路径上的每个结点的父节点都直接指向根节点。下次查询的时候时间复杂度可以优化到O(1)return p[x];
}int main()
{for(int i =0;i<N;i++) p[i]=i;int n,m;bool flag ;cin>>n>>m;while(m--){char op[2];int a,b;scanf("%s%d%d",op,&a,&b);if(op[0] == 'M') p[find(a)] = find(b);//合并:让其中一个结点所在的树变成另一个结点的子树else{if(find(a) == find(b)) cout<<"Yes"<<endl;else cout<<"No"<<endl;}}
}

  

http://www.sczhlp.com/news/75992/

相关文章:

  • 网站开发工程师累不累网易企业邮箱后缀怎么设置
  • 简述网站内容如何优化进行网站建设视频
  • 精美的网站电子商务网站建设实训作业
  • 太原制作网站的公司网站邢台市地图全图高清版
  • 设计公司网站的要点wordpress 建站 教程
  • 三门峡 网站开发网站建设开发感想
  • 做昆虫类论文网站广州建筑集团官网首页
  • 网站的后台怎么做调查问卷太原云起时网站建设
  • 亚马逊电子商务网站的建设全站仪如何建站
  • 免费空间做自己的网站网站公司文化怎么做
  • 问卷星网站开发市场调查问卷百度做网站投广告
  • 邯郸哪儿做网站好自己做网站需要备案么
  • 淄博英文网站建设完整的app网站开发
  • Backrest - 基于Restic的现代化备份解决方案
  • 高压直流系统及相关电气件
  • 电子商务网站例wordpress弹幕视频主题
  • 东莞长安网站设计网易云邮箱
  • 遵义企业做网站crack wordpress
  • 专业网站建设公司电话wordpress 文章太窄
  • 深圳seo网站推广方案有赞小程序官网
  • 做网站平台的公司济南住房和城乡建设厅网站
  • 怎样在网站做推广WordPress如何调用
  • 网站改了标题会怎么样网站 div
  • 2025/09/06 leetCode101. 对称二叉树
  • 百度网站建设前期都有哪些费用win8网站模板
  • 淄博网站建设-至信网络中国建设综合门户网站
  • 主机开设成功 网站正在建设中降低
  • 网站的网站建设公司成都市住房与城乡建设厅网站
  • 滴道网站建设织梦做的网站怎么上传视频
  • 企业网站建设总结官方网站建设