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 an undirected 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
.
Example 1:
Input: [[1,2], [1,3], [2,3]]
Output: [2,3]
Explanation: The given undirected graph will be like this:
1
/ \
2 - 3
Example 2:
Input: [[1,2], [2,3], [3,4], [1,4], [1,5]]
Output: [1,4]
Explanation: The given undirected graph will be like this:
5 - 1 - 2
| |
4 - 3
Note:
- The size of the input 2D-array will be between 3 and 1000.
- Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array.
Update (2017-09-26):
We have overhauled the problem description + test cases and specified clearly the graph is an undirected graph. For the directed graph follow up please see Redundant Connection II). We apologize for any inconvenience caused.
题目链接:https://leetcode-cn.com/problems/redundant-connection/
思路
其实这道题就在不断添加连边的时候,判断新边连接的是否是同组的点。
所以连接问题用并查集解决。
!注意几个并查集使用的tip:
1)最好先做parent的初始化,每个点各自指向自己;
2)union的时候修改的是根节点的指向,不是当前节点的指向!(这点经常出错)
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
vector<int> res;
int num = edges.size();
if(num==0) return res;
int parent[1001];
for(int i=0; i<1001; ++i){
parent[i] = i;
}
for(auto edge: edges){
if(!unionEle(edge[0], edge[1], parent)){
return edge;
}
}
return res;
}
int find(int p, int parent[]){
while(p!=parent[p]){
parent[p] = parent[parent[p]];
p = parent[p];
}
return parent[p];
}
bool unionEle(int p, int q, int parent[]){
int pp = find(p,parent);
int qp = find(q,parent);
if(pp==qp) return false;
parent[pp] = qp;
return true;
}
};