算法笔记之并查集
Posted FHenryh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记之并查集相关的知识,希望对你有一定的参考价值。
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。
一、并查集的定义
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。
并查集,顾名思义,支持以下两种操作操作:
-
并(Union):把两个不相交的集合合并为一个集合。
-
查(Find):查询两个元素是否在同一个集合中。
二、并查集的实现
并查集往往用树来存,使用 \\(f\\) 数组表示每个节点的父节点,初始 \\(f_i=i\\),即认自己为父亲,
那么我们就可以得到这样的一颗树:
查询
查询 \\(x\\) 的根节点就是找到其祖先。
int f[N];
int find(int x)
if(f[x]==x)return x;
return find(f[x]);
但这样会有一个问题:当数据很大时,树的深度会很高,所以我们需要压缩路径。
我们可以在查询的过程中,让 \\(x\\) 认自己的祖先为父亲,那么就可以大大缩小深度。
优化代码如下:
int f[N];
int find(int x)
if(f[x]==x)return x;
return f[x]=find(f[x]);
\\[这个人颓废去了,n年后再更
\\]
本文来自博客园,作者:FHenryh,转载请注明原文链接:https://www.cnblogs.com/FHenryh/p/find-and-union.html
算法复习之并查集
并查集是一种以树结构建立的能够高效处理分组问题中合并,查找操作的数据结构
支持三种基本操作:建立,查询,合并
实现:
1 #include<iostream> 2 using namespace std; 3 const int maxn=10000; 4 int a[maxn],heigh[maxn],par[maxn]; 5 void init(int n) 6 { 7 for(int i=0;i<n;i++) 8 { 9 par[i]=i; 10 heigh[i]=1; 11 } 12 } 13 int findPar(int x) 14 { 15 if(x==par[x]) 16 return x; 17 //递归求父亲,并直接连向根,路径压缩 18 else 19 return par[x]=fin(par[x]); 20 } 21 void connect(int x,int y) 22 { 23 x=findPar(x); 24 y=findPar(y); 25 if(x==y) 26 return ; 27 //如果父亲不相等,比较高度,合并 28 if(heigh[x]<heigh[y]) 29 { 30 par[x]=y; 31 } 32 else{ 33 par[y]=x; 34 if(heigh[x]==heigh[y]) 35 heigh[x]++; 36 } 37 }
以上是关于算法笔记之并查集的主要内容,如果未能解决你的问题,请参考以下文章