首页 > 其他分享 >并查集

并查集

时间:2023-08-16 16:47:51浏览次数:34  
标签:int void 查集 find fa 节点

一:并查集的基本操作:

1.初始化:

  让每个节点的父节点指向本身

void init() {
	for (int i = 0; i < N; i++) fa[i] = i;
}

2.查询:

用递归的方法查询此节点的根节点,一层一层访问父节点,直至根节点(根节点的标志就是父节点是本身)。要判断两个元素是否属于同一个集合,只需要看它们的根节点是否相同即可。

int find(int x) {
	return fa[x] == x ? x : find(fa[x]);
}

3.合并:

1.合并1—3:

2.接着合并1—2,4—5,4—6,1—4.

 

先找到两个集合的代表元素,然后将前者的父节点设为后者即可。当然也可以将后者的父节点设为前者

void merge(int a, int b) {
	fa[find(a)] = find(b);//把a的根节点并到b的根节点上
}

 例1:How Many Tables

题意:

 

标签:int,void,查集,find,fa,节点
From: https://www.cnblogs.com/wsccz/p/17635468.html

相关文章

  • 为什么会变成这样呢? #3(并查集维护区间)
    给定长度为\(n\)的字符串\(S\)以及\(m\)个区间\([l_i,r_i]\),记\(T=S[l_1,r_1]+\cdots+S[l_m,r_m]\),其中\(S[x,y]\)表示从第\(x\)个字符到第\(y\)个字符的子串。求如何重新排列\(S\)中字符的顺序使得\(T\)的字典序尽可能大。期望复杂度:近似\(O(n)\)。czy's......
  • 学不会的并查集
    前言又被薄纱了捏,发现没有队友啥都做不了捏,发现自己并查集忘光光捏,惨捏,感觉自己好没有用捏,捏,捏……牢骚结束,努力捏( ̄▽ ̄)*......
  • 并查集专题
    并查集专题\(AcWing\)\(836\).合并集合【最简并查集,路径压缩概念】\(AcWing\)\(837\).连通块中点的数量【并查集+附加家族成员数量】\(AcWing\)\(240\).食物链【扩展域并查集,带权并查集】\(AcWing\)\(1250\).格子游戏【普通并查集】\(AcWing\)\(1252\).搭配......
  • 并查集
    亲戚问题图论模型:每个人看作一个结点,亲戚关系看作无向边。查询时,只关心是否连通,不关心内部具体的层级关系。所以可以将各个层级直接压缩。每插入一个元素就直接向根节点合并(路径压缩)。例题:P1551|AC记录常见应用维护传递性问题例题:P3958|AC记录扩展域形式(更为......
  • 并查集处理区间跳跃
    在网上胡乱找的一些关于并查集处理区间跳跃(也有叫区间覆盖/序列联通性,这类问题有没有什么统一叫法存疑?)的题目,或许能学习后成为一种套路参考:区间跳跃问题KnightTournament板子题维护一个并查集\(nxt\),\(nxt[i]\)为从\(i\)开始(包含\(i\))的第一个没有被打败的骑士的编号并查集......
  • 「学习笔记」并查集
    真的有必要说吗?直接上封装好的模板吧,包含路径压缩和按秩合并。structunion_find_set{intfa[N],siz[N];int&operator[](constint&x){returnfa[x];}voidreset(){for(inti=1;i<=n;++i){fa[i]=i;......
  • 7999: 路径图 并查集
    描述 给定一个n个顶点(1~n编号),m条边的简单无向图,判断是否是一个路径图。路径图要求:必须存在一个顶点序列v1,v2,...,vn,它是1~n的一个排列,且对于任何1<=i<=n-1,vi和vi+1之间有边相连,而对于任何1<=i,j<=n(其中|i-j|>=2),vi和vj之间没有边相连。 输入 第一行为两个正......
  • 造船(并查集)思路详解
    造船题目描述:题目描述小Y想要在虚拟世界里造船。最开始m个船的完成度全部都为0。小Y第i时刻可以在a_i和b_i两艘船中选择一艘让这艘船的完成度。由于国家政府是奇数控,所以所有偶数完成度的船只都将被摧毁,小Y想知道m时刻后能剩下来的船只最多有多少艘。输入格式第一行两个......
  • 王道408--数据结构--用数组实现二叉树--并查集及其优化代码
    一、数组实现二叉树(下标从0开始)#include<stdio.h>typedefstruct_TreeNode{intdata;boolIsEmpty;//结点是否为空//因为我们的二叉树不一定是满二叉树,中间可能有一些节点不存在//值为1代表空}TreeNode;//初始化voidInitTreeNode(TreeNodet[......
  • 8/5并查集
    #include<bits/stdc++.h>usingnamespacestd;intn,m;intparent[1000005];voidinit(intn){for(inti=1;i<=n;i++){parent[i]=i;}}intfind(intx){if(parent[x]==x){returnx;}else{parent[x]=find......