Union Find算法总结

基本思想:

  Union Find问题主要用于解决分块问题,对于Union Find问题一般也可以用DFS或BFS解决,但用Union Find更方便一些。该算法一般包含两个函数,Union和Find函数,Find函数就是依据图或树的拓扑关系找到其根节点,Union则是将两个子图或子树合并成一个树。

  具体实现可看如下代码,parent数组存储了当前节点的父节点,如果当前节点为根节点,则其父节点为自己,所以递归调用Find函数直至其父节点等于自身即找到根节点。

  Union函数略复杂,其多了一个rank数组,该数组的作用是决定将子图的合并方式,即rank值小的向rank值大的图合并,直观上来说,就是小图向大图合并。如果两图大小相等,则将第二张图向第一张图合并,并将第一张图的rank值加一。

 1 class Solution {
 2 public:
 3     int Find(vector<int> &parent,int target){
 4         if(parent[target] == target)
 5             return target;
 6         return Find(parent,parent[target]);
 7     }
 8     void Union(vector<int> &parent,vector<int> &rank,int v1,int v2){
 9         int p1 = Find(parent,v1);
10         int p2 = Find(parent,v2);
11         if(p1 == p2) return;
12         if(rank[p1] > rank[p2]) parent[p2] = p1;
13         else if(rank[p1] < rank[p2]) parent[p1] = p2;
14         else{
15             parent[p2] = p1;
16             rank[p1]++;
17         }
18     }
19 }

 

posted on 2018-12-26 15:10  周浩炜  阅读(415)  评论(0编辑  收藏  举报

导航