【数据结构和算法笔记】用并查集求解等价关系_散列表

 

【数据结构和算法笔记】用并查集求解等价关系_数据结构_02

【数据结构和算法笔记】用并查集求解等价关系_数据结构_03

【数据结构和算法笔记】用并查集求解等价关系_算法_04

【数据结构和算法笔记】用并查集求解等价关系_算法_05

 

【数据结构和算法笔记】用并查集求解等价关系_连通分支_06

 

【数据结构和算法笔记】用并查集求解等价关系_连通分支_07

 

【数据结构和算法笔记】用并查集求解等价关系_父节点_08

【数据结构和算法笔记】用并查集求解等价关系_连通分支_09

 

 

【数据结构和算法笔记】用并查集求解等价关系_父节点_10

 

【数据结构和算法笔记】用并查集求解等价关系_父节点_11

【数据结构和算法笔记】用并查集求解等价关系_连通分支_12

 

【数据结构和算法笔记】用并查集求解等价关系_数据结构_13

 

 模板:

class UF
{
private:
  vector<int>father;//father数组
  vector<int>rank;//秩
  int count;//连通分支数
public:
  UF()//构造函数初始化并查集,元素各自成营
  {
   father.assign(n,0);
   rank.assign(n,0);
   for :每个元素
   {
      father[编号]=编号;
      count++;
   }
  }
  int find(int x)
 {
   return x==father[x]?x:(father[x]=find(father[x]);
   //如果x父节点是x,说明x是根节点,返回x
   //如果x不是根节点,x的父节点指向x父节点的根节点,并且返回根节点
 }
 void Union(int x,int y)
 {
  int rootx=find(x);//rootx为x的根节点
  int rooty=find(y);//rooty为y的根节点
  if(rootx==rooty)
  {
    return;
  }
  if(rank[rootx]>rank[rooty])
  {
    father[rooty]=rootx;
  }
  else if(rank[rootx]<rank[rooty])
  {
    father[rootx]=rooty;
  }
  else
  {
    father[rooty]=rootx;
    rank[rootx]++;
  }
  count--;//连通分支数-1
   
 }
int get()
{
  return count;
}

};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.