并查集模板
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 ++;
Mamba never out

浙公网安备 33010602011771号