首页 > 其他分享 >并查集

并查集

时间:2022-12-25 16:58:15浏览次数:52  
标签:return fa int 查集 findf 集合

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

本文章遵守知识共享协议 CC-BY-NC-SA ,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人博客阅读。

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

初始化

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/17004221.html

相关文章

  • 带权并查集
    被老师拖来讲数据结构了带权并查集带权并查集,顾名思义,就是在并查集中加上权值,点权和边权实际上是等价的,因为并查集实际上是多棵树组成的,树上的每个节点,都只有一个父节点,......
  • 一个并查集对象
    实现并查集的查找、合并、类别sizeclassUF{constructor(n){this.parent=Array(n)this.size=[]for(leti=0;i<n;i++){......
  • hdu:继续畅通工程(kruskal的MST并查集实现)
    ProblemDescription省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表......
  • hdu:小希的迷宫(并查集)
    ProblemDescription上次Gardon的迷宫城堡小希玩了很久,现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说......
  • 图论-堆-并查集-2503. 矩阵查询可获得的最大分数
    2503.矩阵查询可获得的最大分数DescriptionDifficulty:困难RelatedTopics:给你一个大小为mxn的整数矩阵grid和一个大小为k的数组queries。找出一个大小......
  • 现在有一个并查集,你需要完成合并和查询操作。
    输入格式:第一行包含两个整数N,M,表示共有N个元素和M个操作。接下来M行,每行包含三个整数zi,xi,yi。当zi=1时,将xi与yi所在的集合合并。当zi=2时,输出xi与yi......
  • leetcode 6256. 将节点分成尽可能多的组 二分图判定+bfs+并查集
    6256.将节点分成尽可能多的组难度困难7收藏分享切换为英文接收动态反馈给你一个正整数 n ,表示一个 无向 图中的节点数目,节点编号从 1 到 n 。同时给你一个......
  • 并查集
    typedefstruct{ElementTypeData;intParent;//双亲表示法}SetType;intFind(SetTypeS[],ElementTypeX){inti;for(i=0;i<MaxSize......
  • POJ - 1308 Is It A Tree?(并查集)
    POJ-1308IsItATree?(并查集)题目大意:传送门对于每一组测试样例,给出若干条无向边,判断由这些无向边构成的图是否为无环连通图题目分析:要点1:无环联通图(树)的性质:边......
  • [模板] 并查集
    并查集structDSU{vector<int>fa,rk;explicitDSU(intn):fa(n+1),rk(n+1){for(inti=1;i<=n;i++)fa[i]=i;}......