并查集板子

来源:互联网 发布:何以知之的以 编辑:程序博客网 时间:2024/06/05 02:10
int pre[1000 ];int find(int x)                                                                                                         //查找根节点{     int r=x;    while ( pre[r ] != r )                                                                                              //返回根节点 r          r=pre[r ];     int i=x , j ;    while( i != r )                                                                                                        //路径压缩    {         j = pre[ i ]; // 在改变上级之前用临时变量  j 记录下他的值          pre[ i ]= r ; //把上级改为根节点         i=j;    }    return r ;}  void join(int x,int y)                                                                                                    //判断x y是否连通,                                                                                             //如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起,{    int fx=find(x),fy=find(y);    if(fx!=fy)        pre[fx ]=fy;}


按秩合并:

// 初始化n个元素void init(int n){    for(int i=0;i<n;i++)    {        parent[i]=i;        rank[i]=0;   // 初始树的高度为0    }}// 合并x和y所属的集合void unite(int x,int y){    x=find(x);    y=find(y);    if(x==y) return ;    if(rank[x]<rank[y])        parent[x]=y;  // 合并是从rank小的向rank大的连边    else    {        parent[y]=x;        if(rank[x]==rank[y]) rank[x]++;    }}


原创粉丝点击