并查集总结

来源:互联网 发布:openwrt手机网络共享 编辑:程序博客网 时间:2024/06/05 02:20

                                                                                                并查集总结

一.并查集的应用

并查集是一种树形的高级数据结构,主要用于处理不相交集合的合并及查询问题。查询元素a和元素b是否属于同一组、合并元素a和元素b所在的组。主要应用于:求解最小生成树,亲戚关系的判定,确定无向图的连通分支数,最小公共祖先问题等

二.并查集模板

int par[maxn];//父亲int rank[maxn];//树的高度void init(int n)//初始化n个元素{    for(int i=0;i<n;i++)    {        par[i]=i;        rank[i]=0;    }}int find(int x)//查询树的根{    if(par[x]==x)return x;    else return par[x]=find(par[x]);}void unite(int x,int y)//合并x和y所属集合{    x=find(x);    y=find(y);    if(x==y)return ;    if(rank[x]<rank[y])par[x]=y;    else     {        par[y]=x;        if(rank[x]==rank[y])rank[x]++;    }}bool same(int x,int y)//判断x和y是否属于同一个集合{    return find(x)==find(y);}
三.加权并查集模板

int par[maxn];//父亲int rank[maxn];//树的高度int dis[maxn];//到根结点的距离void init(int n)//初始化n个元素{    for(int i=0;i<n;i++)    {        par[i]=i;        rank[i]=0;    }}int find(int x)//查询树的根{    if(par[x]==x)return x;    else     {        int root=find_(par[x]);//在这个过程中递归求出了par[x]到根的距离dis[par[x]]        dis[x]+=dis[par[x]];        return par[x]=root;    }}void unite(int x,int y)//合并x和y所属集合{    x=find(x);    y=find(y);    if(x==y)return ;    if(rank[x]<rank[y])par[x]=y;    else     {        par[y]=x;        if(rank[x]==rank[y])rank[x]++;    }}bool same(int x,int y)//判断x和y是否属于同一个集合{    return find(x)==find(y);}


感觉自己对并查集的理解不够深入,模板也不会改...模板不是一层不变的,一定要学会根据题意修改模板