// 并查集初始化 voidinit(){ for (int i = 1; i <= n; i++) father[i] = i; }
join
tips: join(u,v) 不是将u和v相连,而是将它们的根相连
即 join(int u, int v) 函数里 要分别对 u 和 v 寻根之后再进行关联
1 2 3 4 5 6 7
// 将v->u 这条边加入并查集 voidjoin(int u, int v){ u = find(u); // 寻找u的根 v = find(v); // 寻找v的根 if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回 father[v] = u; }
find
函数返回类型为 int
1 2 3 4 5
// 并查集里寻根的过程 intfind(int u){ if (u == father[u]) return u; // 如果根就是自己,直接返回 elsereturnfind(father[u]); // 如果根不是自己,就根据数组下标一层一层向下找 }