首页 > 其他分享 >并查集

并查集

时间:2024-08-22 16:37:11浏览次数:4  
标签:元素 return int 查集 father root

在一些有 N 个元素集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内竞赛题中,其特点是看似并不复杂,但数据量极大,若用传统的线性表等数据结构来描述的话,往往超过了空间的限制;即使在空间上能勉强通过,运行的时间复杂度也极高,根本不可能在比赛规定的运行时间内计算出试题需要的结果,只能采用一种特殊数据结构——并查集来描述。
一、数学准备
首先,我们从数学的角度给出等价关系的定义:
定义:如果集合 S 中的关系 R 是自反的,对称的,传递的,则称它为一个等价关系。
—自反:x=x;
—对称:若 x=y,则 y=x;
—传递:若 x=y、y=z,则 x=z。
要求:x、y、z 必须要同一个全集中。
〖程序清单〗 (1)并查集的数据定义:int father[maxn]; (2)初始化: for(int i=1; i<=n; i++) father[i]=i; 因为每个元素属于单独的一个集合,所以每个元素以自己作为根结点。 (3)寻找根结点编号并压缩路径:

int root(int v) // 获取父亲/根元素
{
  if (father[v]!=v) father[v]= getfather(father[v]);
  return father[v];
  return father[v] == v ? v : father[v] = root(father[v]);
}
(4)合并两个集合:
void union(int x, int y)
{
  x= root(x);
  y= root(y);
  root[x]=y;
}
(5)判断元素是否属于同一结合:
bool judge(int x, int y:)
{
  x= root(x);
  y= root(y);
  if (x==y) return true;
      else return false;
}
这个的引题已经完全阐述了并查集的基本操作和作用。
int main(){
  cin>> n>> m>> p;
  for(int i=1; i<=n; i++) father[i]=i; //初始化
  for(int i=1; i<=m; i++){
    cin>> ai>> bi;
    union(ai, bi); 
    }
  for (int i=1; i<=p; i++){
    cin>> pi1>> pi2;
    if (judge(pi1, pi2)) 
      cout<<”Yes”<<endl;
    else cout<<”No”<< endl;
    }
  return 0;
}

标签:元素,return,int,查集,father,root
From: https://www.cnblogs.com/Mono-Awen/p/18374205

相关文章

  • 并查集(保姆级讲解)
    文章目录什么是并查集查找合并例题代码什么是并查集并查集是一种树形的数据结构。支持两种操作**查找:**确定某个元素在那个集合**合并:**将两个集合的元素合并在一起查找1.朴素查找2.优化查找合并1.朴素合并2.优化合并因为朴素合并的时间复杂度已经......
  • 并查集扩展
    并查集扩展目录并查集扩展普通并查集例题:1.洛谷P1197星球大战2.洛谷P1955程序自动分析带权并查集例题:1.洛谷P2024食物链2.洛谷P1196银河英雄传说3.洛谷P5937ParityGame扩展域并查集例题:1.洛谷P1525关押罪犯普通并查集例题:1.洛谷P1197星球大战链接:[P1197JSOI20......
  • 并查集(路径压缩法+启发式合并法)
    我们从一道例题看起:洛谷P1551亲戚。问题很简单,给出一个亲戚关系图,规定\(x\)和\(y\)是亲戚,\(y\)和\(z\)是亲戚,那么\(x\)和\(z\)也是亲戚,那么\(x\)的亲戚都是\(y\)的亲戚,\(y\)的亲戚也都是\(x\)的亲戚,再给定\(P_i\)和\(P_j\),询问他们是否是亲戚,输出Yes或......
  • 并查集
    并查集(递归写法)#include<bits/stdc++.h>usingnamespacestd;constintX=10010;intf[X];intn,m; //初始化voidinit(){ for(inti=0;i<X;i++){ f[i]=i; }}//查找上级是谁intfind(intx){ if(x!=f[x]){ returnf[x]=find(f[x]);//路径......
  • 【知识】并查集的单点删除 &【题解】SP5150
    \(\mathfrak{1st.}\)前言-->题目传送门<--原先这道题的难度是紫,我觉得题目翻译看不懂,就去讨论版发了个贴,然后题管更新了题目翻译,并且把难度降到了蓝……\(\mathfrak{2nd.}\)思路赶时间或嫌啰嗦的可以直接跳到『思路归纳』。我们先从普通并查集开始思考对于删除单点\(x\),......
  • 关于并查集
    关于冰茶姬简述冰茶姬是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。顾名思义,冰茶姬支持两种操作:合并(Union):合并两个元素所属集合(合并对应的树)查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于......
  • P5836 [USACO19DEC] Milk Visits S(树上并查集)
    核心思路对于相同颜色且相邻的点合并。若不在同一集合,则0若在同一集合,同色1异色0AC代码#include<bits/stdc++.h>usingnamespacestd;intfa[1145141];charcol[1145141];intn,m;intfind(intx){ if(x==fa[x]) returnx; returnfa[x]=find(fa[x]);}v......
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
    刷题记录*并查集理论基础107.寻找存在的路径*并查集理论基础讲解107.寻找存在的路径题目地址直接套模板。结点编号从1开始,因此定义father数组时需要n+1个空间,否则会越界。时间复杂度:O(......
  • 广场舞老太太都看得懂的并查集
    1.并查集为什么叫“并查集”这个名字?因为并查集它的主要用处就是并(合并无交集集合)和查(查找元素或判断是否有该元素),当然路径压缩也得用到它。话说回来,并查集虽然是图论里的东西,但是本身像个树。2.算法说到并查集,就不得不提到压缩路径了,它是一个超级简单,但是很牛的算法,算法主......
  • 为什么并查集路径压缩不需要维护rank?
    在基于rank进行优化的并查集中,路径压缩确实不需要维护rank数组。这是因为路径压缩和rank优化有不同的目的和作用机制。让我们详细解释一下原因:Rank优化的目的:Rank优化的主要目的是在合并两个集合时,让较小的树成为较大的树的子树,以保持树的平衡性。这样可以避免树变得过于深,从而......