首页 > 其他分享 >并查集

并查集

时间:2024-05-08 13:37:16浏览次数:17  
标签:int fy 查集 father fx size

并查集

并查集模板

包含路径压缩+小挂大

const int MAXN = 1e5 + 1;
int father[MAXN];  // 存父亲节点 father[1] =2 指的是1节点的父亲为2
int size[MAXN];	   // 存每个集合的大小
int stack[MAXN];   // 
int n;

// 建立并查集
void build(){
	for(int i = 0; i <= n; i ++ ){
        father[i] = i;
        size[i] = 1;
    }
}

// 查找元素
int find(int i){
    // 沿途收集了几个点
	int size = 0;
    while(i != father[i]){
        stack[size ++ ] = i;
        i = father[i];
    }
    // 沿途节点收集好了,i已经跳到代表节点了
    while(size > 0){
        father[stack[-- size ]] = i;
    }
    return i;
}

bool isSameSet(int x, int y){
    return find(x) == find(y);
}

void union(int x, int y){
    int fx = find(x);
    int fy = find(y);
    if(fx != fy){
        if(size[fx] >= size[fy]){
            size[fx] += size[fy];
            father[fy] = fx;
        }else{
            size[fy] += size[fx];
            father[fx] = fy;
        }
    }
}

并查集模板(精简版)

路径压缩

const int MAXN = 1001;
int father[MANX];
int n;

void build(){
    for(int i = 0; i <= n; i ++ ){
        father[i] = i;
    }
}

int find(int i){
    if(i != father[i]){
        father[i] = find(father[i]);  // 路径压缩
    }
	return father[i];
}

bool isSameSet(int x, int y){
    return find(x) == find(y);
}

void union(int x, int y){
    father[find(x)] = find(y);
}

标签:int,fy,查集,father,fx,size
From: https://www.cnblogs.com/hnu-hua/p/18179456

相关文章

  • hdu1213并查集
    第一种方法是定义每个数的老大是其自身,通过每次输入的两个数,找到它两的老大,比较大小,循环将所有大的那个老大改为小的那个数,最后输出有几个老大是其自身,案例都能过,提交就错,不知错哪了......点击查看代码importjava.util.Scanner;publicclasshdu1213{ publicstaticvoid......
  • 边权并查集之奇偶游戏
    题目传送门:https://www.acwing.com/problem/content/241///懒得手敲题目先给一下题解:#include<iostream>#include<unordered_map>//这个题目有两个点要想明白,一个是点到根的距离标志着这个点的性质,且在路径压缩的过程中此点不会改变//第二点就是在出现新的关系,也就是要将两......
  • [算法学习笔记] 并查集
    提示:本文并非并查集模板讲解,是在模板基础上的进一步理解以及拓展。Review并查集可以用来维护集合问题。例如,已知\(a,b\)同属一个集合,\(b,c\)同属一个集合。那么\(a,b,c\)都属一个集合。并查集分为合并,查询操作。定义\(fa_i\)表示点\(i\)的父亲。为了降低复杂度,在fi......
  • 并查集
    1.0并查集概念对于具有传递性质、联通集合的题目可以考虑并查集。1.1并查集模板声明:以下模板来自于https://xuq7bkgch1.feishu.cn/docx/CAbedNJ5KobvinxdyKgcKsrlnrd。有n个数,编号是1~n,最开始每个数各自在一个集合中,现在要进行m个操作,操作共有两种:1.Mab,将编号为a......
  • 528. 奶酪(并查集orBFS)
    题面如下:https://www.acwing.com/problem/content/530/大致思路是:合并所有连接的空洞,判断下表面的空洞和上表面的空洞是否是同一集合集合#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>usingnamespacestd;constintN......
  • 倍增并查集
    如果你既会倍增,又会并查集,那你一定会倍增并查集吧!link数据范围明示\(O(n^2)\)无法通过。众所周知,倍增是\(O(\logn)\)的,并查集近似\(O(n)\)的,它们结合一下不就能过了吗?先来重新考虑一下倍增的本质。倍增倍增最经典的用法是ST表。我们将一个区间拆成两个长为\(2^k\)......
  • 928. 尽量减少恶意软件的传播 II【并查集加暴力删边判断】
    题意不是很清晰:1.比如对于graph=[[1,1,0],[1,1,1],[0,1,1]],initial=[0,1]来说,可以发现结点的链接情况是0-1-2,感染源结点是0和1,若是按之前题目的要求,移除0和1都不会减少最终感染个数,但是应该返回结点0,因为其index小。但是应用此题的条件,就一定要返回结点1,因为移除结点1之......
  • P3295 [SCOI2016] 萌萌哒(倍增并查集)
    题意简述有一个长为\(n\)的数字序列\(s\),有\(q\)组限制\(l_1,r_1,l_2,r_2\)形如\(s_{l_1,\cdots,r_1}=s_{l_2\cdots,r_2}\),求满足所有限制的\(s\)的方案数,数字序列不能有前导0。\(n,q\le10^5\),保证\([l_1,r_1]\)和\([l_2,r_2]\)大小相等。分析字符之间的等量......
  • 2019年蓝桥杯省赛-修改数组(并查集)
    0.题目时间限制:1.0s内存限制:256.0MB本题总分:20分【问题描述】给定一个长度为N的数组A=[A1,A2,···AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,···,AN。当修改Ai时,小明会检查......
  • 蓝桥杯-并查集-合根植物
    0.题目1.解析1.1并查集思路主要三大模板功能1.初始化(init)2.寻找父节点(find)3.合并(merge)我们在find中可以使用路径压缩简化运算,缩短运行时间而启发式合并则可以将运行时间压缩,由O(n)到o(logn)代码#include<bits/stdc++.h>usingnamespacestd;constintMaxn......