并查集
what:并查集是一种用来管理元素分组情况的数据结构。
作用:1.查询元素a,b是否属于同一组。
2.合并元素a,b所在的组。
结构:树形,不是二叉树。
注意:防止树形结构发生退化,将所有元素找到她的根节点,让其父结点,直接为他的根节点,方便查询。
并查集模板:
1.查找:
1》递归模式(复杂度高,不建议使用。
int find(int v)
{
if(fa[v]==v)
return v;
else
{
fa[v]=find(fa[v]);//路径压缩
return fa[v];
}
}
2》循环模式
int find(int x)
{
int r = x;
while (r != fa[x])
{
r = fa[x];
}
int i = x, j;
while (fa[i] != r)
{
j = fa[i];
fa[i] = r;
i = j;
}
return r;
}
2.合并
void unite(int x, int y)
{
int fx = find(x);
int fy = find(y);
if (fx != fy)
fa[y] = x;
}
带权并查集:唯一的不同之处在于他含有一个v数组储存权值。根据不同情况,推出某状态下权值的关系(可记录多种,以情况而定)。记录。
带权并查集大神详解:https://agatelee.cn/2017/05/%E5%B8%A6%E6%9D%83%E5%B9%B6%E6%9F%A5%E9%9B%86/