用递归的思路写的并查集, 觉得更容易理解, 虽然此处并没有针对每一个小集合的大小进行优化, 算法执行过程当中有可能会导致某一个集合变得很大:
unordered_map<int, int> f;
int find(int x) {
if (!f.count(x)) f[x] = x;
if (x != f[x]) f[x] = find(f[x]);
return f[x];
}
void uni(int x, int y) {
x = find(x), y = find(y);
if (x != y) f[x] = y;
}