int find(int x)
{
if(x!=fa[x])
{
int t=fa[x];
fa[x]=find(fa[x]);
}
return fa[x];
}
void lianjie(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
{
fa[a]=b;
}
}
然后是加权的
苦恼了我有一段日子
对于带权并查集其实只要把它想成一个向量相加减,就很好想通了
主要考虑两种情况
第一种是当两个 东西父节点不一样时,要将其连接并改变其权值
第二种是父节点一样时,根据其权值进行判断关系
主要模板如下
int find(int x)
{
if (x != parent[x])
{
int t = parent[x];
parent[x] = find(parent[x]);
value[x] += value[t];
}
return parent[x];
}
int px = find(x);
int py = find(y);
if (px != py)
{
parent[px] = py;
value[px] = -value[x] + value[y] + s;
}
配上一个令我茅塞顿开的图片
特别感谢大佬的博客