题目描述
树可以看成是一个连通且 无环 的 无向 图。
给定往一棵 n
个节点 (节点值 1~n
) 的树中添加一条边后的图。添加的边的两个顶点包含在 1
到 n
中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n
的二维数组 edges
,edges[i] = [ai, bi]
表示图中在 ai
和 bi
之间存在一条边。
请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n
个节点的树。如果有多个答案,则返回数组 edges
中最后出现的那个。
示例 1:
输入: edges = [[1,2], [1,3], [2,3]] 输出: [2,3]
示例 2:
输入: edges = [[1,2], [2,3], [3,4], [1,4], [1,5]] 输出: [1,4]
解题思路
并查集模板题,由题意易得只有一条冗余的边。先初始化并查集,将每个节点的父节点都设为自己,然后开始遍历所有的边,若a、b之间存在一条边,且他们两个节点不在同一个集合内,那么就将其合并到一起,若两个节点已经在一个集合了,则证明这条边为冗余的边,再合并就会成环。
AC代码
class Solution {
public:
static const int N = 1e3 + 5;
int p[N];
int find(int x) {
if(p[x] != x)
p[x] = find(p[x]);
return p[x];
}
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
for(int i = 1; i <= edges.size(); i ++ )
p[i] = i;
vector<int> ans; int idx = 0;
for(auto edge: edges) {
int node_a = edge[0], node_b = edge[1];
if(find(node_a) == find(node_b)) {
ans.clear();
ans = {node_a, node_b};
}
else
p[find(node_b)] = find(node_a);
}
return ans;
}
};