首页 > 其他分享 >数据结构-并查集

数据结构-并查集

时间:2023-10-04 17:22:21浏览次数:32  
标签:return px int bing 查集 find 数据结构 节点

并查集的使用范围:  

  1.合并集合

  2.查询两元素是否属于同一集合 

  高级用法:

  3.进行集合划分<带权并查集>

  4.连通块块数查询&块内元素个数统计<连通图>

  5.撤销合并<可持久化并查集> //本文暂不涉及, 我还不会

并查集基本操作:

#define rep(i,n) for(int i = 1; i <= n; i++) //简写for循环
class  DisjointSet{
private:
	int bing[Size];
public:
	void init(int n);//初始化操作
	int find(int x);//寻找父节点&路径压缩
	void merge(int x, int y);//合并集合
	bool same(int x, int y);//查询元素是否同属一个集合
};
初始化
 void init(int n)
{
	rep(i, n) bing[i] = i;//初始化,每个节点指向自己
}
寻找父节点&路径压缩
int find(int x)
{
	if(bing[x] == x) return x;//根节点
	return bing[x] = find(bing[x]);//路径压缩
}
合并集合
void merge(int x, int y)
{
	int px = find(x);
	int py = find(y);//寻找根节点
	if(px == py) return;//同属一个集合
	bing[px] = py;//集合合并
}
查询
 bool same(int x, int y)
{
	return find(x) == find(y);
}

并查集拓展操作_带权并查集

  带权并查集的权重指代的是某一节点到集合中根节点的距离, 利用带权并查集可以实现二分图的划分, 和循环指向性集合的划分. 在维护过程中, 距离可以不为1.

class  DisjointSet{
private:
	int bing[Size];
	int deep[Size];//距离根节点的距离
public:
	void init(int n);
	int find(int x);
	bool merge(int x, int y, int distance);//distance指代的是x点到y点的距离
};
初始化
 void init(int n)
{
	rep(i, n)
	{
		bing[i] = i;
		deep[i] = 0; //根节点的深度设定为0 
	}
}
寻找父节点&路径压缩
int find(int x)
{
	if(bing[x] != x)
	{
		int t = bing[x]; //保证更新之后加上的节点仍为t 
		bing[x] = find(bing[x]);
		deep[i] += deep[t]; //叠加权重 
	}
	return bing[x];
}
合并集合
 bool merge(int x, int y, int distance)
{
	int px = find(x);
	int py = find(y);
	if(px == py)
	{
		if(deep[x] - deep[y] != distance) //若在同一集合且距离与给定值不同
			return false;
	}
	else
	{
		bing[px] = py;
		deep[px] = deep[y] - deep[x] + distance; //确定原根节点的权重
	}
	return true;
}

并查集的拓展操作_连通图

  利用并查集, 可以获得所有节点的连通块个数以及每一个连通块的元素个数. 我们利用根节点记录连通块内的元素数量, 需要查询时, 直接查询根节点的数据即可.

class  DisjointSet{
private:
	int bing[Size];
	int num[Size];//每一个连通块的数量
	int lian;
public:
	void init(int n);
	int find(int x);
	void merge(int x, int y);
        int get_num(int x); //获得x元素所在的连通块内的元素个数
};
初始化
 void init(int n)
{
	rep(i, n)
	{
		bing[i] = i;
		num[i] = 1;//未合并之前的块内元素为1 
	}
	lian = n; //未合并之前的连通块数量为n 
}
寻找父节点&路径压缩
 int find(int x)//同最基础
{
	if(bing[x] == x) return x;
	return bing[x] = find(bing[x]);
}
合并集合
void merge(int x, int y)
{
	int px = find(x);
	int py = find(y);
	if(px == py) return;
	bing[px] = py;
	num[py] += num[px];//将px所包含的元素个数都转移给py
	lian--;//连通块的个数会因为合并而减少
}
获得元素个数
 int get_num(int x)
{
	return num[find(x)];//一定要注意是查找根节点的数据
}

标签:return,px,int,bing,查集,find,数据结构,节点
From: https://www.cnblogs.com/slotifnotias/p/17742430.html

相关文章

  • 点赞功能改进-Redis数据结构设计
        ......
  • 数据结构之"顺序表"
    前言......
  • 第03章 Python的数据结构、函数和文件
    本章讨论Python的内置功能,这些功能本书会用到很多。虽然扩展库,比如pandas和Numpy,使处理大数据集很方便,但它们是和Python的内置数据处理工具一同使用的。我们会从Python最基础的数据结构开始:元组、列表、字典和集合。然后会讨论创建你自己的、可重复使用的Python函数。最后,会学习P......
  • 高级数据结构--树状数组
    一维树状数组单点修改-区间查询输入32123120213输出6数据范围对于所有数据,\(1≤n,q≤10^6,∣a[i]∣≤10^6,1≤l≤r≤n,∣x∣≤10^6\)。点击查看代码#include<bits/stdc++.h>#defineIOSios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nu......
  • 【数据结构】3.跳表和散列
    1.顺序链表字典1.1字典抽象父类#pragmaonceusingnamespacestd;template<classK,classE>classdictionary{public:virtual~dictionary(){}//返回字典是否为空virtualboolempty()const=0;//返回有多少键值对virtualintsize()co......
  • [数据结构和算法] 堆/优先队列的实现
    预备知识:完全二叉树可以用数组表示:从下标0开始存储数据:左子节点=2*父节点+1,右子节点=2*父节点+2;从下标1开始存储数据:左子结点=2*父节点,右子节点=2*父节点+1;堆:大根堆:父节点的值大于等于左右子节点的值;小根堆:父节点的值小于等于左右子节点的值;......
  • 【数据结构】2.栈和队列
    1.栈1.1栈的抽象父类#pragmaoncetemplate<classT>classStack{public://析构函数virtual~Stack(){}//栈是否为空virtualboolempty()const=0;//栈的大小virtualintsize()const=0;//栈顶元素virtualT&top()=0......
  • 基础数据结构:数组实现的单链表(静态链表)、双链表
    1、单链表(静态链表)以AcWing.826为例,题目要求如下:实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第k个插入的数后面的数;在第k个插入的数后插入一个数。现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第k个插入的数并不是指当......
  • 【数据结构】串
    串串的顺序实现简单的模式匹配算法KMP算法KMP算法的进一步优化串的顺序实现初始化#defineMaxSize50typedefcharElemType;//顺序存储表示typedefstruct{ElemTypedata[MaxSize];intlength;}SString;/***初始化串*/voidInitString(SString*string)......
  • 【数据结构】线性表
    线性表顺序表链式存储单链表双链表知识目录顺序表概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。特点:逻辑上相邻的数据元素,物理次序也是相邻的。只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存......