并查集模板

 1 class UnionFind 
 2 {
 3 public:
 4     int count; // 记录连通分量个数
 5     vector<int> parent; // 存储若干棵树
 6     vector<int> size; // 记录每棵树包含的节点数
 7 
 8     UnionFind(int n) 
 9     {
10         count = n;
11         parent = vector<int>(n);
12         size = vector<int>(n);
13         for (int i = 0; i < n; i++) 
14         {
15             parent[i] = i;
16             size[i] = 1;
17         }
18     }
19 
20     /* 将 p 和 q 连通 */
21     void Union(int p, int q) 
22     {
23         int rootP = Find(p);
24         int rootQ = Find(q);
25         if (rootP == rootQ) return;
26 
27         // 小树接到大树下面,较平衡
28         if (size[rootP] > size[rootQ]) 
29         {
30             parent[rootQ] = rootP;
31             size[rootP] += size[rootQ];
32         } 
33         else 
34         {
35             parent[rootP] = rootQ;
36             size[rootQ] += size[rootP];
37         }
38         count--;
39     }
40 
41     /* 判断 p 和 q 是否互相连通 */
42     bool Connected(int p, int q) 
43     {
44         int rootP = Find(p);
45         int rootQ = Find(q);
46         // 处于同一棵树上的节点,相互连通
47         return rootP == rootQ;
48     }
49 
50     /* 返回节点 x 的根节点 */
51     int Find(int x) 
52     {
53         if (parent[x] != x) // 进行路径压缩
54         {
55             parent[x] = Find(parent[x]);
56         }
57         return parent[x];
58     }
59 };

 

class UnionFind 
{
public:
    vector<int> parent; // 存储若干棵树
    UnionFind(int n) 
    {
        for (int i = 0; i < n; i++)  parent.push_back(i);
    }
    /* 返回节点 x 的根节点 */
    int Find(int x) 
    {
        // 进行路径压缩
        if (parent[x] != x) parent[x] = Find(parent[x]);
        return parent[x];
    }
    void Union(int p, int q) 
    {
        int rootP = Find(p);
        int rootQ = Find(q);
        if (rootP == rootQ) return;

        parent[rootQ] = rootP;
    }
};
当前节点是不是带头大哥,如果是,res++。因为每一个连通图都有一个带头大哥
遍历所有结点,if(uf.Find(id) == id) res ++;
posted @ 2020-04-09 21:27  Jinxiaobo0509  阅读(157)  评论(0)    收藏  举报