![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
并查集的概念和应用
超级码力奥
这个作者很懒,什么都没留下…
展开
-
并查集的概念和基本应用
● 将两个集合合并p[find(a)]=find(b) find函数会直接指向他们的祖先。直接改变a的祖先节点的指向,把b的祖先节点设定为a的祖先节点● 询问两个元素是否在同一个集合中直接判断:find(a)==find(b)● 合并操作:在操作过程中进行了路径压缩,原本x的父节点p[x]不一定是根节点,但是find函数执行一遍,就把x的父节点以及祖先节点的p[x]都指向根节点了//假设这个函数可以返回x的祖宗节点,就是根节点//加了路径压缩,直接让把每个节点的父节点直接指向了根节点,也就.原创 2022-03-05 15:45:24 · 86 阅读 · 0 评论 -
并查集-合并集合
考察点:将两个集合合并, 判断两个元素是否在同一个集合中。一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m 个操作,操作共有两种:M a b,将编号为 aa 和 bb 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Q a b 询问编号为 aa 和 bb 的两个数是否在同一个集合中;#include<iostream>using namespace std;const int N=100010;int n,m;int原创 2022-03-05 15:49:56 · 108 阅读 · 0 评论 -
离散化+并查集 程序自动分析 先处理输入中的所有相等关系,把 相等关系划到一个集合里边,然后对于每个不等关系进行判断
原题链接:https://www.acwing.com/problem/content/description/239/考察点:离散化+并查集。由于题目中直接开并查集数组的话,范围会到1e9,数组直接爆掉。但是输入中只用到了1e6个数,所以把这1e6个数进行离散化。先处理输入中的所有相等关系,把 相等关系划到一个集合里边,然后对于每个不等关系进行判断即可。// 并查集数组有点大,所以需要离散化。#include<iostream>#include<cstring>#in原创 2022-03-06 08:34:12 · 109 阅读 · 0 评论 -
并查集-判断是否存在环
不论是向下连一条边,还是向右连一条边,只要新连的那个点也在边所在的这个集合中,那么就成环了。如果不在这个集合中,就把这个点加到这个集合中。询问这样的操作m次之后,有没有成环。/* 就是一个裸的并查集,不论是向下连一条边,还是 向右连一条边,只要新连的那个点也在边所在的 这个集合中,那么就成环了。*/#include<iostream>#include<cstring>using namespace std;const int N = 4001.原创 2022-03-05 15:58:18 · 1205 阅读 · 0 评论 -
并查集-连通块中点的数量,记录每个集合的大小
考察点:记录每个集合的大小,这个属性可以绑定到根节点上。#include<iostream>using namespace std;const int N=100010;int n,m;// 集合中点的数量由祖宗来维护。int p[N],s[N];int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x];}int main(){ scanf("%d%d",&n,&m原创 2022-03-05 15:53:17 · 333 阅读 · 0 评论 -
并查集-搭配购买 并查集合并之后再01背包
https://www.acwing.com/problem/content/1254//* 把捆绑销售的东西全部合成一个物品,就是一个裸的01背包*/#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 10010;int n, m, vol; //背包体积int v[N], w[N];int p[N];int原创 2022-03-05 16:01:40 · 60 阅读 · 0 评论