题目

分析
对于无向图成环的问题,这篇文章提到了几种解法,由于题集归纳到了并查集中,并且像多练习一下并查集,所以采用并查集来解决。
对于无向图成环,题目提供的是若干以两个端点构成的无向边,并且是以第一个节点1-n的顺序出现的,所以我们可以对每个元素进行并查集的"加入集合"操作,如果还没有加入到同一个集合,那么说明事先还没有存在的边,反之,如果查到根节点相同,说明之前已经被加入到同一个集合中,这个时候就能认为这条边是冗余的。而因为是顺序访问的,所以第一条被判为冗余的边就是答案。
代码
cpp
class UnionFind{
private:
vector<int>f;
vector<int>res;
public:
UnionFind(int size){//构造函数初始化
f.resize(size);
for(int i = 0;i<size;i++){
f[i] = i;
}
}
int find(int x){//带路径优化的寻根操作
if(f[x]!=x){
f[x] = find(f[x]);
}
return f[x];
}
bool unite(int x,int y){//加入集合操作,并查集的判断操作等核心逻辑是在这里实现的。如果已经在相同集合就说明该条边是冗余的。
int rootX = find(x);
int rootY = find(y);
if(rootX==rootY){
return false;
}
f[rootX] = rootY;
return true;
}
};
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
vector<int>res;
int n = edges.size();
UnionFind uf(n+1);
for(int i = 0;i<n;i++){
if(!uf.unite(edges[i][0],edges[i][1])){//当找到冗余边后直接返回它,结束算法
return edges[i];
}
else continue;
}
return res;//注意没有冗余的情况
}
};
结果
