首页 > 其他分享 >并查集模板

并查集模板

时间:2023-03-22 12:44:25浏览次数:45  
标签:结点 路径 int 查集 集合 find 模板

并查集(Union(并),Find(查),Set(集))

一般用树的形式保存集合,但是是用数组模拟的树


对于并查集树上的所有点,只有根结点是p[x]=x的,其他的p[x]都是父结点

那么就可以通过while(p[x]!=x)x=p[x];来查询一个点的编号,属于哪个集合

询问两个元素是否在同一个集合中,直接查询两个元素的编号是否相同即可

合并两个集合:直接让一个集合树直接插到另一个集合树的某个结点即可,这样就实现了集合合并(同一个编号根节点)

对于while(p[x]!=x)x=p[x];的优化:
首先通过while(p[x]!=x)x=p[x];去找到根节点,现在是只有一条路径
找到根节点后,直接把一路上找的所有祖先点都直接连上根结点
这样一条长路径就变成长度为1的路径了
这样的操作叫做路径压缩,寻找每个点的编号的效率也就大大提高了,接近O(1)


#include<iostream>

using namespace std;

const int N = 100010;

int n,m;
int p[N];//元素父节点

//最核心操作
int find(int x)//返回x祖宗结点 + 路径压缩
{
	if(p[x] != x)p[x]=find(p[x]);//p[x]不是根结点,就让p[x]=祖宗结点(即find(p[x])
	return p[x];//压缩 
}

int main()
{
	cin >> n >> m;
	//初始时每一个元素是单独一个集合
	//每一个集合只有一个点,集合的树根就是自己
	//当p[x]=x的时候,x就为树根
	for(int i=1;i<=n;i++)p[i]=i;
	
	while(m -- )
	{
		string op;
		int a,b;
		cin >> op >> a >> b;
		if( op == "M") p[find(a)] = find(b);//find(a)为a的祖宗结点,设置a所在的集合树 接上b集合的根结点
		else
		{
			if(find(a) == find(b))cout << "Yes" << endl;
			else cout << "No" << endl;
		}
	}
	
	return 0;
}

 

标签:结点,路径,int,查集,集合,find,模板
From: https://www.cnblogs.com/lxl-233/p/17243308.html

相关文章

  • 前端HTML/CSS模板
    在写HTML项目的时候可以参考下面的模板:1)效果/HTML代码/CSS样式HTML代码CSS样式:2)效果:HTML代码:CSS样式:......
  • 前端设计模式——模板方法模式
    模板方法模式(TemplateMethodPattern):定义一个行为的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个行为的结构即可重定义该行为的某些特定步骤。这些步......
  • JQuery模板示例
    ......
  • log4j.properties模板
     日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。日志记录器(Logger)的可用级别Level(不包括自定义级别Level),以下内容就是摘自log4jAPI(ht......
  • 【Unity3D】基于模板测试和顶点膨胀的描边方法
    1前言​选中物体描边特效中介绍了基于模板纹理模糊膨胀的描边方法,该方法实现了软描边,效果较好,但是为了得到模糊纹理,对屏幕像素进行了多次渲染,效率欠佳。本文将介绍......
  • OpenStack使用ISO镜像安装虚拟机制作镜像模板(本文底稿原创,由ChatGPT润色)
    在OpenStack云平台中,使用ISO镜像安装虚拟机是非常常见的一种方式。本文将介绍如何在OpenStack中使用ISO镜像创建一个虚拟机,并将其制作成模板。第一步,我们需要将ISO镜像上......
  • 15_SpringBoot_模板引擎总结_了解
    jsp优点:1、功能强大,可以写java代码2、支持jsp标签(jsptag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签库缺点:性能问题。不支持前后端分离freemarker......
  • 15_SpringBoot_模板引擎总结_了解
    jsp优点:1、功能强大,可以写java代码2、支持jsp标签(jsptag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签库缺点:性能问题。不支持前后端分离freemarker......
  • C++温故补缺(十三):模板
    C++模板模板是泛型的基础,泛型编程就是一种独立于任何特殊类型的方式编写代码。模板就是创建泛型类或泛型函数的蓝图。STL库中的几个数据结构(vector,list,map等)以及算法......
  • 15_SpringBoot_模板引擎总结_了解
    jsp优点:1、功能强大,可以写java代码2、支持jsp标签(jsptag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签库缺点:性能问题。不支持前后端分离freemarkerFreeMa......