并查集:
int find(int x)
{
if (p[x] != x)
{
p[x] = find(p[x]);
}// 如果x不是自己的父节点,则递归查找其根节点,并进行路径压缩
return p[x];
}
带权并查集一般考的话,板子不固定
思想很重要
核心在这两个数组: d[N], p[N]
int find(int x)
{
if(x != p[x])
{
//核心是这三步
//其他具体题具体分析
//1、找到根结点root
//2、计算父节点到上一个父节点的距离d[p[x]],同时进行路径压缩(路径压缩后,上一父///节点即root)
//3、d[x]初始值是x到p[x]的距离,更新d[x]值,即d[x] = d[x] + d[p[x]]
int root = p[x];
d[x] += d[p[x]];
p[x] = root;
}
return p[x];
}