码迷,mamicode.com
首页 > 其他好文 > 详细

【模板/经典题型】并查集维护生成树

时间:2019-01-20 13:47:30      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:维护   find   --   ras   题型   oid   code   ase   ++   

这里的并查集是按秩合并并查集。
这种方法维护生成树的时候可以维护一个点到根的权值。
但是由于合并的时候做了一个类似换根一样的操作,因此这个权值通常只能是异或之类的。

//find-union-set
int top,f[N],v[N],sz[N],sk[M];
int find(int x){return x==f[x]?f[x]:find(f[x]);}
int value(int x){return x==f[x]?0:v[x]^value(f[x]);}
bool merge(int a,int b)
{
    int x=find(a),y=find(b);
    if(x==y)return false;
    if(sz[x]>sz[y])swap(x,y),swap(a,b);
    v[x]=value(a)^value(b)^1;
    f[x]=y;sz[y]+=sz[x];sk[++top]=x;
    return true;
}
void erase()
{
    int x=sk[top];
    sz[f[x]]-=sz[x];f[x]=x;v[x]=0;top--;
}

【模板/经典题型】并查集维护生成树

标签:维护   find   --   ras   题型   oid   code   ase   ++   

原文地址:https://www.cnblogs.com/Creed-qwq/p/10294416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!