并查集+路径压缩

匿名 (未验证) 提交于 2019-12-02 23:47:01

初始化:

void init(int n) {     for (int i=0;i<n;i++)      {           parent[i]=i;            rank[i]=0;      } }

查询根节点:

int Find(int x) {     if (parent[x]==x)      return x;     else       return parent[x]=Find(parent[x]); }

合并集合:

void Unite(int w,int v) {     int x=Find(w);     int y=Find(v);    if(x==y) return ;        if (rank[x]<rank[y])       parent[x]=y;    else{       parent[y]=x;       if (rank[x]==rank[y]) rank[x]++;         parent[x]=y; }

路径压缩:

①递归:

int Find(int x)       //查找x元素所在的集合,回溯时压缩路径 {     if (x != parent[x])     {         parent[x] = Find(parent[x]);     //回溯时的压缩路径     }         //从x结点搜索到祖先结点所经过的结点都指向该祖先结点     return parent[x]; }

②非递归:

int Find(int x) {     int k, j, r;     r = x;     while(r != parent[r])     //查找跟节点         r = parent[r];      //找到跟节点,用r记录下     k = x;             while(k != r)             //非递归路径压缩操作     {         j = parent[k];         //用j暂存parent[k]的父节点          parent[k] = r;        //parent[x]指向跟节点          k = j;                    //k移到父节点     }     return r;         //返回根节点的值             }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!