并查集
应用场景:将有关系的元素放在一个集合中。
参考文章:并查集
相关例题:洛谷1551
相关代码:
> // @ Time: 21/2/24 21:01
// @ Author: A Fei
//并查集
const int N = 5001;
int fa[N], rank[N];
//初始化
void init(int n)
{
for(int i=1; i<=n; i++)
{
fa[i] = i;//初始每个元素的父节点都是自己
rank[i] = 1;// 记录每个节点的子树深度 初始每个元素父节点是自己,那么深度就为1.
}
}
//查找x的父节点,并将该元素的父节点变成对应的根节点(路径压缩)
int find(int x)
{
return fa[x]==x ? x : (fa[x] = find(fa[x]));//这里三元 ? 的优先级高于赋值号 = 所以要加括号!
}
//按秩合并 将深度小的合并到深度大的上面(rank[i] < rank[m]), 深度相等就任意,此时深度要加一
void merge(int n, int m)
{
int x = find(n), y = find(m);
if(rank[x] <= rank[y])
fa[x] = y;
else
fa[y] = x;
if(rank[x] == rank[y] && x != y)
rank[y]++;
}