首页 > 其他分享 >并查集学习笔记

并查集学习笔记

时间:2023-08-25 11:12:58浏览次数:44  
标签:fa -- 查集 笔记 学习 int flowchart TD find

并查集的定义

并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。
——百度百科

并查集,顾名思义,支持以下两种操作操作:

  • 并(Union):把两个不相交的集合合并为一个集合。
  • 查(Find):查询两个元素是否在同一个集合中。

并查集的实现

并查集往往用来存,若使用\(f\)数组表示每个节点的父节点,则\(f_i\)表示第\(i\)个节点的父节点,初始\(f_i=i\),初始节点即认自己为父亲,

那么我们就可以得到这样的一颗树:

flowchart TD 1 --> 1 1 --> 2 1 --> 3 1 --> 4 3 --> 5 3 --> 6

查询

初始化时每个节点的根节点就是它自己。

int f[N];
int find(int x){
	if(f[x]==x)return x;
	return find(f[x]);
}

但这样会有一个问题:当数据很大时,树的深度会很高,所以我们需要压缩路径。

我们可以在查询的过程中,让每个点认自己的祖先为父亲,那么就可以大大缩小深度。(即路径压缩)

优化代码如下:

int f[N];
int find(int x){
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}

这样树就会变成

flowchart TD 1 --> 1 1 --> 2 1 --> 3 1 --> 4 1 --> 5 1 --> 6

合并

假如要合并两棵树:

flowchart TD 1 --> 1 1 --> 2 1 --> 3 1 --> 4 3 --> 5 3 --> 6

flowchart TD 7 --> 7 7 --> 8 8 --> 10 7 --> 9 8 --> 11

先路径压缩并找到组先(分别为 \(1\) 和 \(7\))

flowchart TD 1 --> 1 1 --> 2 1 --> 3 1 --> 4 1 --> 5 1 --> 6

flowchart TD 7 --> 7 7 --> 8 7 --> 10 7 --> 9 7 --> 11

再将 \(7\) 并到 \(1\) 下:

flowchart TD 1 --> 1 1 --> 2 1 --> 3 1 --> 4 1 --> 5 1 --> 6 1 --> 7 7 --> 7 7 --> 8 7 --> 10 7 --> 9 7 --> 11

所以得出结论:

当要合并两个子集是,可以让被合并的子集的祖先任另一个子集的祖先为父亲

代码如下:

int a,b;
cin>>a>>b;
int fs=find(a),fs2=find(b);
if(fs!=fs2)fa[fs]=fs2;

例题

P1536 村村通

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int fa[10010]={0},ans;
int find(int x){
    if(x!=fa[x])fa[x]=find(fa[x]);
    return fa[x];
}
int s,n,m,a,b;
signed main(){
	//freopen("bicj.out","w",stdout);
	while(1){
    	cin>>n;
    	bool t1[10001]={0};
    	if(n==0)break;
		cin>>m;
		if(m==0){
			cout<<n-1<<endl;
			continue;
		}
    	ans=n;
    	for(int i=1;i<=n+3;i++)fa[i]=i;
    	for(int i=1;i<=m;i++){
    		int a,b;
     	 	cin>>a>>b;
     	 	t1[a]=t1[b]=1;
      	 	int fs=find(a),fs2=find(b);
       		fa[fs]=fs2;
   		}
    	int t[1500]={0},ans=0;
   	 	for(int i=1;i<=n;i++){
    		t[find(i)]++;
    		//cout<<find(i)<<" ";
    	}
    	//cout<<endl;
    	for(int i=1;i<=n;i++){
    		if(t[i])ans++;
    	}
    	cout<<ans-1<<endl;
	}
    return 0;
}

标签:fa,--,查集,笔记,学习,int,flowchart,TD,find
From: https://www.cnblogs.com/ccr-note/p/bingcj.html

相关文章

  • 字典树学习笔记
    字典树字典树(Trie)简介又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比......
  • Markdown学习
    MarkDown学习标题字体hello,word!**+**hello,word!*+*hello,word!***+***hello,word!~~+~~引用hello,word!>+空格非分线---/***图片超链接名称[我的博客](晓光1004的主页-博客园(cnblogs.com))列表+空格q表格......
  • 并行求解器基础知识学习
      1.数字化工具的新特征    。。。。物理机-->虚拟化-->容器化   2.分布式并行编程基础(1)传相关并行编程框架:MPI(消息传递接口)——一种典型的并行编程框架OpenCL   CUDA(2)HDFS分布式文件系统下的MapReduce并行模式shuffle调度  ......
  • 联邦学习:对“数据隐私保护”和“数据孤岛”困境的破局
    作者:vivo互联网安全团队- TuDaxi随着计算力、算法和数据量的巨大发展,人工智能迎来第3次发展高潮,开始了各行业的落地探索。然而,在“大数据”兴起的同时,更多行业应用领域中是“小数据”或者质量很差的数据。“数据孤岛”现象广泛存在,例如在信息安全领域的应用中,虽然多家企业推出......
  • BeautifulSoup:学习使用BeautifulSoup库进行HTML解析和数据提取。
    BeautifulSoup是一个用于解析HTML和XML文档的Python库。它可以帮助我们从网页中提取数据,并以易于操作的方式进行分析。以下是使用BeautifulSoup进行HTML解析和数据提取的基本语法:安装BeautifulSoup库:首先,你需要在你的Python环境中安装BeautifulSoup库。可以使用以下命令进行安......
  • Linux学习疑惑总结
    重定向问题Linuxshell中2>&1的含义首先了解下1和2在Linux中代表什么,先整理一份在Linux系统中012是一个文件描述符:名称代码操作符Java中表示Linux下文件描述符(Debian为例)标准输入(stdin)0<或<<System.in/dev/stdin->/proc/self/fd/0->/dev/pts/0......
  • abp-vnext-pro 实战(九,前端vue和vben学习)
    vben效果 VbenAdmin(vvbin.cn) 对应的代码在 vue-vben-admin/src/views/demo/page/form/basic/data.tsatmain·vbenjs/vue-vben-admin(github.com){field:'time',component:'RangePicker',label:'起止日期',colProps:{......
  • 《深入理解Java虚拟机》读书笔记:方法调用
      方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍、最频繁的操作,但前面已经讲过,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件......
  • 赵老师 计数原理 课程笔记
    计数原理分类加法计数原理与分步乘法计数原理分类加法计数原理引例题干用一个大写的英文字母或一个阿拉伯数字给教室里的一个座位编号,总共能编出多少种不同的号码?解决因为英文字母共有\(26\)个,阿拉伯数字共有\(10\)个,所以总共可以编出\(26+10=36\)种不同的号......
  • Programming abstractions in C阅读笔记:p127-p129
    《ProgrammingAbstractionsInC》学习第51天,p127-p129,总结如下:一、技术总结1.stringlibrary掌握常用函数如strlen,strcpy用法。2.bufferoverflow(缓冲区溢出)(1)什么是buffer?p129,Arraysthatarepreallocatedandlateruseasarepositoryfordatacalledbuffers......