In this problem, a tree is an undirected graph that is connected and has no cycles.
The given input is a graph that started as a tree with N nodes (with distinct values 1, 2, ..., N), with one additional edge added. The added edge has two different vertices chosen from 1 to N, and was not an edge that already existed.
The resulting graph is given as a 2D-array of edges
. Each element of edges
is
a pair [u, v]
with u
< v
, that represents anundirected edge connecting nodes u
and v
.
Return an edge that can be removed so that the resulting graph is a tree of N nodes. If there are multiple answers, return the answer that occurs last in the given 2D-array. The answer edge [u,
v]
should be in the same format, with u < v
.
题解:并查集,遍历所有的边,每次遍历一条边时,若两个点不在一个集合内,将两个点加入一个集合,否则输出该跳边。
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int parent[2000];
int edge_num = edges.size();
for(int i = 0; i <= edge_num; i++){
parent[i] = i;
}
for(int i = 0; i < edge_num; i++){
int first_node = edges[i][0];
int second_node = edges[i][1];
int first_node_parent = find_parent(parent, first_node);
int second_node_parent = find_parent(parent, second_node);
if (first_node_parent == second_node_parent){
return edges[i];
}
else{
parent[second_node_parent] = first_node_parent;
}
}
}
int find_parent(int parent[2000], int node){
if(node == parent[node]){
return node;
}
else{
parent[node] = find_parent(parent, parent[node]);
return parent[node];
}
}
};