冗余连接
并查集简单应用的题目。
UnionFind是并查集,用哈希表保存元素的父节点,mergeSet函数将两个集合合并,addSet将元素加入集合,find返回元素的父节点同时进行路径压缩。
findRedundantConnection函数将每个节点都加入并查集之后,按照入参合并集合。
如果两个元素具有相同的父节点,同时还有一条额外的边,那么这条边是多余的,返回即可。
class UnionFind{
unordered_map<int, int> mmap;
public:
void mergeSet(int s1, int s2) {
int root1 = find(s1);
int root2 = find(s2);
if (root1 != root2) {
mmap[root1] = root2;
}
}
void addSet(int s) {
if (mmap.count(s) == 0) {
mmap[s] = s;
}
}
int find(int s) {
int root = s;
while (mmap[root] != root) {
root = mmap[root];
}
while (mmap[s] != s) {
int tmp = mmap[s];
mmap[s] = root;
s = tmp;
}
return root;
}
};
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
UnionFind uf;
for (const auto& edge : edges) {
int s1 = edge[0], s2 = edge[1];
uf.addSet(s1);
uf.addSet(s2);
if (uf.find(s1) == uf.find(s2)) {
return edge;
} else {
uf.mergeSet(s1, s2);
}
}
return {};
}
};