基本是个裸并查集的题目,从edges数组中遍历每条边,并构造并查集。如果一条边的两个顶点,则这条边就是构成回路的最后一条边。又因为无向图是由一棵树加上一条额外的边所构成的,所以显然,这样的回路只存在一个,则这样的一条边就是所求。
// 并查集
class Solution {
public:
int findf(vector<int> &f, int nodes) {
if (f[nodes] != nodes) {
int father = findf(f, f[nodes]); // 继续寻找父结点
f[nodes] = father;
}
return f[nodes];
}
void combine(vector<int> &f, int nodes1, int nodes2) { // 合并时要先找到两个结点的父结点,然后再合并它们的父结点
f[findf(f, nodes2)] = findf(f, nodes1);
}
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int n = edges.size();
vector<int> f(n + 1);
for (int i = 0; i < n + 1; ++i) {
f[i] = i;
}
for (int i = 0; i < n; ++i) {
int father1 = findf(f, edges[i][0]), father2 = findf(f, edges[i][1]);
if (father1 != father2) {
combine(f, edges[i][0], edges[i][1]);
}
else {
return vector<int> ({edges[i][0], edges[i][1]});
}
}
return vector<int> ();
}
};