首页 > 其他分享 >【数据结构】并查集(1) 萌新的并查集学习之路

【数据结构】并查集(1) 萌新的并查集学习之路

时间:2022-09-02 01:11:35浏览次数:99  
标签:上级 int 查集 fa 查找 萌新 数据结构 find

最基本的并查集:维护n个元素间的相关关系

并查集的初始化为将n个元素各自看成一个集合,并通过不断的合并命令(将两个集合的根节点指向同一处)和查找命令(查找两个集合的根节点是否相同)来实现n个元素间相关关系的维护。通常使用多个树形结构即森林来表示各个集合,在初始化时将n个树的根节点指向自身,并在后续查找和合并的过程中不断维护
借用《啊哈算法》中的比喻形象解释,可以看做有n个小偷属于不同(也可能相同)的团伙,为了确定两个小偷是否属于同一个团伙,最方便的方式是查找他们的上级是否相同。
例如有5个小偷 1 2 3 4 5,那么设置数组fa[n+5],并依次初始化为自己的下标(用于标记自己的上级,如初始状态下fa[1]=1说明1此时上级是1本身)。
image

图1

已知3和5是同一个团伙,那么设3为5的上级(反之亦成立),此时fa[5]=3此操作称为合并操作(union)
image

图2

又有已知4和5为同伙,那么只需要令fa[4]=5,即4的上级为5(反之亦然)。
image

图3

此时我们查询 1 和 4是否为同一个团伙,只需要查找1 和 4 的大BOSS是不是同一个人。发现1的上级为1本身,而4的上级为55的上级为3,因此4的上级为3,发现二者上级不同,说明不是同一个团伙。该过程中对上面两个元素查找上级的操作称为查找操作(find)

优化_对find操作的优化

由图3可看出,当我们合并时有可能使得这棵树过长而影响效率,因此可以使用名为路径压缩的方式优化查找过程,即在查找过程中,如果自己的父节点不是根节点,则将自己和自己父节点同时指向根节点.仍然引用《啊哈算法》的比喻,当你的上级归顺于他的上级时,他的上级也就想当然变成了你的上级。该过程便被称为路径压缩。

/*
	前置定义:定义一个int fa[]用于储存每个元素的根节点
	这是使用路径优化后的查找 find函数
*/
int find(int x){
	if(fa[x]!=x)
		fa[x]=find(fa[x]);
	return fa[x];
}
优化_对union 操作的优化

既然可以通过对查找过程优化来进行路径压缩,那么有没有什么方式可以对合并的方式进行优化呢?答案是肯定的。
首先对合并的过程进行分析可知:

至此我们可以处理并查集的一些模板题,例如洛谷P3367 【模板】并查集

ac代码如下:

#include<stdio.h>
int* fa;
int find(int x){
	if(fa[x]!=x)
		fa[x]=find(fa[x]);
	return fa[x];
}
void union_it(int x,int y){
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
		fa[fx]=fy;
}
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	fa=(int*)malloc((n+5)*sizeof(int));
	for(int i=0;i<n;i++)
		fa[i]=i;
	for(;m--;){
		int c,x,y;
		scanf("%d %d %d",&c,&x,&y);
		if(c==1)
			union_it(x,y);
		else{
			if(find(x)==find(y))
				printf("Y\n");
			else
				printf("N\n");		
		}

	}
	return 0;
}

标签:上级,int,查集,fa,查找,萌新,数据结构,find
From: https://www.cnblogs.com/Chitoge/p/16647955.html

相关文章

  • [Google] LeetCode 1101 The Earliest Moment When Everyone Become Friends 并查集
    Therearenpeopleinasocialgrouplabeledfrom0ton-1.Youaregivenanarraylogswherelogs[i]=[timestampi,xi,yi]indicatesthatxiandyiwillbe......
  • 算法与数据结构系列
    算法与数据结构系列从零到英雄的算法和数据结构这是算法和数据结构系列从零到英雄的目录。BigO表示法数据结构数组和字符串链表堆栈尾巴树木图表算法选择......
  • 数据结构草图
    数据结构草图最近我推出了简约的在线绘图应用程序okso.app.我希望它是一个人们可以对任何概念进行快速、临时、基于餐巾纸的解释的地方,就好像你和你的朋友坐在一起,试图......
  • 数据结构第一天 -831
    要点解决问题方法的效率,跟空间的利用效率有关解决问题方法的效率,跟算法的巧妙程度有关上述问题中,如果按照题目给定的式子去写程序,利用次方的关系写,就是f1对应的关系,实......
  • 基本的数据结构
    数据结构1.1数据结构概述数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性......
  • 并查集
    https://leetcode.cn/problems/number-of-islands/给你一个由 '1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方......
  • 你需要知道的 Python 基础知识:数据结构
    你需要知道的Python基础知识:数据结构数据结构是一种存储、组织和处理数据的格式,它允许您有效地对其执行操作Photoby保罗花冈on不飞溅例如,存储人们的电子邮件地......
  • 数据结构之链表的原理
    链表:在计算机中用一组任意的存储单元存储线性表的数据元素称为链式存储结构,这组存储结构可以是连续的,也可以是不连续的,因此在存储数据元素时可以动态分配内存。注:在java中......
  • 【数据结构】二叉树-二叉树类别
    满二叉树如果二叉树中除了叶子结点,每个结点的度都为2,则此二叉树称为满二叉树。 完全二叉树1.如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右......
  • 算法提高课 第四章 数据结构之并查集
    一、并查集1250.格子游戏思路O(mlog(n))将图中的每个点看作并查集的结点,每个被画的边看作合并相邻的点的操作将图中所有点按行或列优先,从1~n*m进行编号每次进行......