首页 > 其他分享 >并查集

并查集

时间:2023-04-29 18:22:44浏览次数:29  
标签:int 查集 编号 集合 节点 size

并查集

  1. 将两个集合合并
  2. 询问两个元素是否在一个集合当中

基本原理: 每个集合用一颗树来表示, 树根的编号就是整个集合的编号. 每个节点存储它的父节点, p[x] 表示 x 的父节点.

① 如何判断树根 if(p[x]==x)

② 如何求x的集合编号 while(p[x]!=x)x=p[x]

③ 如何合并两个集合 p[x] 是 x 的集合编号, p[y] 是 y 的集合编号, p[x]=y

优化: 路径压缩



普通并查集

//并查集模板

int p[N];
for(int i=1;i<=n;i++)p[i]=i;	//初始化,假定节点编号是1~n

int find (int x)	//返回x的祖宗节点 + 路径压缩
{
    if(p[x]!=x)p[x]=find(p[x]);
    return p[x];
}

//合并a和b所在的两个集合
p[find(a)]=find(b)



维护size的并查集

//维护size的并查集模板

int p[N],size[N];
for(int i=1;i<=n;i++)	//初始化,假定节点编号是1~n
{						//size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量
    p[i]=i;
    size[i]=1;
}

int find (int x)	//返回x的祖宗节点 + 路径压缩
{
    if(p[x]!=x)p[x]=find(p[x]);
    return p[x];
}

//合并a和b所在的两个集合
size[find(b)]+=size[find(a)];
p[find(a)]=find(b);
//注意:顺序不能调换



维护到祖宗节点距离的并查集

//维护到祖宗节点距离的并查集模板

int p[N],d[N];	//p[]存储每个点的祖宗节点,d[x]存储x到p[x]的距离
for(int i=1;i<=n;i++)p[i]=i;

int find (int x)	//返回x的祖宗节点 + 路径压缩
{
    if(p[x]!=x)
    {
        int u=find(p[x]);
        d[x]+=d[p[x]];
        p[x]=u;
    }
    return p[x];
}

//合并a和b所在的两个集合
p[find(a)]=find(b);
d[find(a)]=distance;  //根据具体问题,初始化find(a)的偏移量


标签:int,查集,编号,集合,节点,size
From: https://www.cnblogs.com/evilboy/p/17364334.html

相关文章

  • 5760: 家庭问题 并查集
    描述 有n个人,编号为1,2,……n,另外还知道存在K个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有多少人?例如:n=6,k=3,三个关系为(1,2),(1,3),(4,5)此时,6个人组成三个家庭,即:{1,2,3}为一个家庭,{4,5}为一个家......
  • C语言刷leetcode——并查集
    目录概述参考链接:刷题入门题:547.省份数量(朋友圈)684.冗余连接概述https://leetcode.cn/problems/number-of-provinces/solution/python-duo-tu-xiang-jie-bing-cha-ji-by-m-vjdr/基本概念并查集是一种数据结构并查集这三个字,一个字代表一个意思。并(Union),代表合并查(Find),......
  • 数据结构——并查集
    并查集的作用:可以在近乎O(1)的时间内完成以下两个操作1、将两个集合合并2、询问两个元素是否在一个集合中 基本原理:用“树”的形式来维护每一个集合,树根的编号就是整个集合的编号,每个结点存储它的父结点(如:p[x]表示x的父结点)问题1:如何判断树根?  A:if(p[x]==x),当前x就是......
  • 并查集の进阶用法
    普通并查集我们在处理问题的时候,可能会遇到一些需要维护每个元素所在的集合的问题,而并查集却恰好完美解决了这个问题。对于普通的并查集,他支持的操作比较少,只有合并和查询,合并是指把两个集合合并成一个,而查询是询问两个元素是否在同一集合内;对于这两种操作,我们可以用一个数组\(......
  • 并查集
    并查集并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素合并(Union):合并两个元素所属集合(合并对应的树)查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合importjava.u......
  • hdu 5441 长春区域赛网络赛 1005 Travel(并查集)
    题目链接:hdu5441题目大意:有一个n个点的无向图,给出m条边的边权,给出q次询问,每次给出一个值,求用到所有边权不大于这个值的边的情况下,能够互相到达的点对的个数(自己到自己不算)题目分析:首先我们对于边按照边权从小到大排序,对于询问按照值从小到大排序。枚举每次询问,从前到后扫描边,如果......
  • 并查集及其扩展(附例题与完整讲解cpp)
    文章目录基础并查集1.P1551亲戚2.P1536村村通种类并查集1.P1892[BOI2003]团伙2.P1525[NOIP2010提高组]关押罪犯3.P2024[NOI2001]食物链带权并查集基础并查集并查集就是用来维护一些元素之间的关系的集合。例如A的亲戚是B,则我们可以把A与B放到同一个集合中,表示AB属......
  • 23-4-15--并查集--部落
    在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。输入格式:输入在第一行给出一个正整数N(≤104),是已知小圈子的个数......
  • 算法-并查集-200
    publicclassSolution{publicintNumIslands(char[][]grid){if(grid==null||grid.Count()==0)return0;introwCount=grid.Count();intcolCount=grid[0].Count();intwaters=0;UnionFinduf=newUnionFind(grid);for......
  • AGC002D Stamp Rally 多种做法 kruskal重构树/可持久化并查集/整体二分
    D-StampRally(atcoder.jp)这题做法很多,我写的是可持久化并查集做法,但是裸的可持久化并查集是$O(nlog^3n)$,能过但是很慢!看洛谷的题解有一位大佬写了一个很妙的并查集的写法,按秩合并,每一步合并时用vector记录一下这个被合并到的节点的size和当前的时间,这样做可以找到每一个时......