首页 > 其他分享 >并查集

并查集

时间:2022-11-21 12:26:34浏览次数:70  
标签:return fa int 查集 findf 集合

title: 并查集
date: 2022-11-15 11:49:57
tags: 算法

本文章遵守知识共享协议 CC-BY-NC-SA ,转载时需要署名,推荐在我的个人博客阅读。

并查集是一种数据结构,用于合并两个集合以及判断两个集合是否联通。

初始化

for(int i=1;i<=n;i++)
    fa[i]=i; // 将每个点的祖先初始化为自己(创建n个集合)

并查集核心函数:找父亲

int findf(int t){
    if(fa[t]==t) // 自己是这个集合的祖先(自己代表这个集合)
        return fa[t]; // 返回id
    return findf(fa[t]); // 继续递归找
}

但是,这样的写法太过低效。可以证明,在极端数据下,会形成链,使查询效率变低。

所以,我们可以添加路径压缩来防止这个问题。

int findf(int t){
    if(fa[t]==t)
        return fa[t];
    return fa[t] = findf(fa[t]); // 修改的位置(记忆化)
}

合并

可以找到两个集合的代表,将一个集合设置为另一个集合。

void merge(int i,int j){
    fa[findf(i)]=findf(j); // 一行代码的事
}

判断是否为同一个集合

只需判断两个集合的代表是否为同一个。

bool equal(int i,int j){
    return findf(i)==findf(j); // 也是一行代码的事
}

模板题目及解析

P3379-【模板】并查集

纯粹的模板题目,应该不用说。

P1892-【BOI2003】团伙

因为题目中写道

  • 一个人的朋友的朋友是朋友
  • 一个人的敌人的敌人是朋友

所以开两倍大小的并查集,若 i , j 是朋友,合并 i , j ,若 i , j 是敌人,合并 i+n , ji , j+n

判断时,若 i , j 联通,则是朋友,若 i+n , ji , j+n 其中任一联通,则是敌人。

标签:return,fa,int,查集,findf,集合
From: https://www.cnblogs.com/rickyxrc/p/16911028.html

相关文章

  • 并查集教学
    并查集简介并查集是一个树形的数据结构,能够实现以下功能:将两个节点所属的两个集合合并查询两个节点是否在一个集合里并查集教学我们以洛谷的并查集板题为例P3367......
  • 落谷 R94681591 -- 并查集+离线算法+倒序处理
    题目描述树的变迁思路因为更改点的权值不会改变树的结构,但是删去一条边会改变树的结构,不同与增加一条边,删除一条边的处理是很麻烦(没实现过!!!)既然我们无法删除一条边,那么......
  • D. Mahmoud and a Dictionary(种类并查集)
    D.MahmoudandaDictionarytimelimitpertest4secondsmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputMahmoudwantstowriteanewdi......
  • 并查集
    并查集本质上是维护一个森林,初始时森林里每个点是一个集合,之后将集合合并,查找一个点所在集合的代表元素,将两个集合的代表元素进行合并。使用时不要忘记初始化!在一般情况下......
  • 20221113_T1A-_并查集
    题意在一个文件目录下有\(n\)个不同的文件,每个文件都有一个文件名,其中第\(i\)个文件的文件名为\(s_i\)。这些文件名两两不同。小C希望更改一部分文件的文件名,他......
  • 浅谈离线树链信息的一种并查集做法
    出处problem一棵树,点上有一些满足结合律的信息,\(m\)次询问求出一条链上的点权之“和”,允许离线。\(n,m\leq10^5\)。solution......
  • 【数据结构-树】并查集的基本操作(待整理)
    目录1数据结构定义2初始化3查找操作4并操作1数据结构定义#defineMAX50intUFSets[MAX];//并查集2初始化//参数:并查集SvoidInit(intS[]){inti;......
  • 20221111_T1B_线段树优化建图/并查集
    题意给定一个字符串,其中只有a和b,现在一个字符能够跳到与之中间a的个数范围在\([l,r]\)的东西。题解赛时得分:100/100对于一个东西,显然如果将能相互到达连边,那么......
  • POJ-1417(带权并查集+01背包+回溯)
    TrueLiars题目描述:Peter有一个王国。在这个王国里,一共有2种人,即诚实人和撒谎人。诚实人永远说真话,撒谎人永远说假话。可惜的是,Peter只记得诚实人的数量和撒谎人的数量......
  • 并查集
    [NOI2001]食物链题目描述动物王国中有三类动物\(A,B,C\),这三类动物的食物链构成了有趣的环形。\(A\)吃\(B\),\(B\)吃\(C\),\(C\)吃\(A\)。现有\(N\)个动物,以\(......