Description
In this problem, a tree is an undirected graph that is connected and has no cycles.
You are given a graph that started as a tree with n
nodes labeled from 1
to 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 graph is represented as an array edges
of length n
where edges[i] = [ai, bi]
indicates that there is an edge between nodes ai
and bi
in the graph.
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 input.
Example 1:
Input: edges = [[1,2],[1,3],[2,3]] Output: [2,3]
Example 2:
Input: edges = [[1,2],[2,3],[3,4],[1,4],[1,5]] Output: [1,4]
Constraints:
n == edges.length
3 <= n <= 1000
edges[i].length == 2
1 <= ai < bi <= edges.length
ai != bi
- There are no repeated edges.
- The given graph is connected.
Code
標準 disjoint set 可以解的題目。
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int n = edges.size();
vector<int> parent(n+1, 0);
vector<int> size(n+1, 1);
for(int i = 0; i < n; i++) {
parent[i] = i;
}
for(auto& edge: edges) {
int p1 = find(edge[0], parent);
int p2 = find(edge[1], parent);
if(p1 != p2) {
if(size[p1] < size[p2]) {
parent[p1] = p2;
size[p2] += size[p1];
} else {
parent[p2] = p1;
size[p1] += size[p2];
}
} else {
return {edge[0], edge[1]};
}
}
return {};
}
// path compression
int find(int idx, vector<int>& parent) {
return parent[idx] = parent[idx] == idx ? idx : find(parent[idx], parent);
}
};