由于最近需要准备蓝桥杯的c++组比赛,所以特地整理出了一些在蓝桥杯中出现的算法,方便复习
并查集
1. 作用
在遇到一道题之后,我该如何判断该题需要使用到并查集呢?
首先我们应该先了解这个并查集是干什么的:
并查集是一种树形数据结构,用于处理一些不相交集合的合并及查询问题。也就是说,当题目中出现让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这个时候我们往往就需要考虑构建并查集。
2. 基本操作
并查集的基本操作有两种:1. 合并 2. 查询
合并即合并并查集中的两个集合,查询即查询任意并查集中的元素的所属集合。
3. 具体实现
首先我们需要创建一个并查集,建立一个数组:pre[]
表示并查集 ,同时pre[i]
表示元素i的父节点,注意是父节点。
接下来我们需要对并查集进行初始化,由于每一个点就是一个集合,因此初始化的时候父节点就是自己本身。
然后我们进行查询操作,让每一个节点不断寻找自己的父节点,若此时自己的父节点就是自己,那么该节点为集合的根节点,返回该节点。
最后我们进行修改操作,合并两个集合,也就是合并两个集合的根节点,即pre[a] = b
,其中a和b是两个元素的根节点。
4. 代码实现
初始化的模板:
for(int i = 1;i <= n;++i) pre[i] = i;
查询的模板
int Find(int a)
{
while(a != root[a])
{
a = root[a];
}
return a;
}
合并的模板:
void merge(int x,int y)
{
int fx = Find(x);
int fy = Find(y);
if(fx != ft) root[fx] = fy;
}