首页 > 其他分享 >并查集

并查集

时间:2024-10-27 22:12:22浏览次数:6  
标签:index int 查集 father vector index2 Find

并查集

并查集是一种数据结构,它主要处理一些不相交集合的合并问题。一些常见的用途有求连通子图、最小生成树Kruskal算法和求公共祖先等。


并查集的主要操作有:

  1. 初始化Init

  2. 查询Find

  3. 合并Union

初始化 Init()

void Init(int n) {
    vector<int> father(n + 1);    //创建数组从节点1开始到n
    for (int i = 1; i <= n; i++) {
        father[i] = i;
    }
}

查询 Find()

int Find(index,vector<int>& father){
    if(father[index]==index){
    return index;
}                          //递归终点
    else {
    father[index]=Find(father[index],father);
    return father[index];
}                          //记忆化搜索
}                          //查找index的祖先

合并 Union()

void Union(int index1,int index2,vector<int>& father){
    father[Find(index1,father)]=Find(index2,father);
}                         //合并index1和index2的祖先

例题:[冗余连接](. - 力扣(LeetCode))

class Solution {
public:
int Find(int index,vector<int>& father){
    if(father[index]==index){
        return index;
    }
    else {
        father[index]=Find(father[index],father);
        return father[index];
    }
}//查找index的祖先
void Union(int index1,int index2,vector<int>& father){
    father[Find(index1,father)]=Find(index2,father);
}//合并index1和index2的祖先
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        int n=edges.size();
        vector<int> father(n+1);
        for(int i=1;i<=n;i++){
            father[i]=i;
        }//初始化节点
        for(auto& edge:edges){
            int node1=edge[0],node2=edge[1];
            if(Find(node1,father)!=Find(node2,father)){
                Union(node1,node2,father);
            }
            else return edge;
        }
        return {};
    }

第一次看这种写法,简直炸裂,学到了:

vector<vector<int>> edges;
for(auto& edge:edges){
    int node1=edge[0],node2=edge[1];
}   //auto& edge 也许是edges中一个向量的索引

标签:index,int,查集,father,vector,index2,Find
From: https://www.cnblogs.com/lihao123212/p/18509103

相关文章

  • 经典算法思想--并查集
    前言 (最近在学习Java,所有函数都是用Java语言来书写的)前言部分是一些前提储备知识在并查集(Union-Find)数据结构中,rank(中文称为“秩”)是用来表示树的高度或深度的一种辅助信息。它的主要作用是优化合并操作,以保持并查集的结构尽可能扁平,从而提高查询效率。秩的具体定义......
  • CF771A. Bear and Friendship Condition 题解 并查集
    题目链接:https://codeforces.com/problemset/problem/771/A视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp/?p=6题目大意:判断一个无向图中的每个连通块是否都是一个完全图。首先我们可以用并查集维护每个连通块的大小。其次,我们可以开一个\(cnt_i\)表示以节点\(i\)......
  • CF1139C. Edgy Trees 题解 并查集
    题目链接:https://codeforces.com/problemset/problem/1139/C视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp?p=3我们可以求总方案数-不满足条件的方案数。设一个不包含黑色边的极大连通块的大小为\(sz_i\)。则答案为\[n^k-\sum\{sz_i^k\}\]示例程序:#include......
  • CF1800E2. Unforgivable Curse (hard version) 题解 并查集
    题目链接:https://codeforces.com/contest/1800/problem/E2视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp?p=2把下标\(i\)对应到图中编号为\(i\)的节点。节点\(i\)和\(i+k\)之间连一条边,节点\(i\)和\(i+k+1\)之间也连一条边。同一个连通块里的节点对应的字......
  • 新高一暑假第一期集训恢复性训练【数据结构-晚测】(并查集)(补)
    新高一暑假第一期集训恢复性训练【数据结构-晚测】(并查集)(补)[CF1290C]PrefixEnlightment带权扩展域并查集。任意三个子集的交集为空集,显然,一个点最多只能在两个集合中出现,这样所有集合的大小之和是\(\Theta(n)\)的。一个在两个集合中出现的点ii相当于连接了\(2\)个集合......
  • 带权并查集 学习笔记
    顾名思义,就是并查集带权值。在路径压缩的时候,我们还要维护权值应该怎么办呢?关联题目:P1196[NOI2002]银河英雄传说。我们对于一个舰队维护一个\(fr\)表示到头部的距离,\(cnt\)表示该舰队的战舰数量。那么每一次合并时,先进行路径压缩,找到父亲,在将父亲的权值传下来即可。因为每......
  • 新高一暑假第一期集训恢复性训练【数据结构-并查集】(补)
    新高一暑假第一期集训恢复性训练【数据结构-并查集】(补)C.[POJ1417]TrueLiars先将题目中的好人和坏人转换一下,也即是如果\(x\)说\(y\)是好人,则他们两属于同一组,反之则不属于同一组。然后我们可以想到带权的并查集,用\(val_x\)代表\(x\)与其父节点的关系,当\(val_x\)......
  • 学习笔记 - 并查集
    本人实力不济,如有错误或建议及补充,请指出1.定义并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。顾名思义,并查集支持两种操作:合并(Union):合并两个元素所属集合(合并对应的树)查询(Find):查询某个元素所属集合(查询......
  • Soso 的并查集写挂了
    题面似乎有原题,但是很偏挂个pdf题面下载算法暴力很显然,只需要在并查集维护时稍微加上一点细节#include<cstdio>usingnamespacestd;intn,m,fa[500010],a[500010];longlongans=0;intfind(intx){ ans+=a[x]; ans%=998244353; if(fa[x]==x)returnx; r......
  • 「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)
    目录概述成员变量创建销毁根节点访问路径压缩启发式合并复杂度Code概述并查集,故名思议,能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。这是一个什么数据结构呢?一般来讲,并查集是由一系列集合组成的集合群。其中,每个集合都有一个根节点,它的......