684. Redundant Connection
/*
* @lc app=leetcode id=684 lang=cpp
*
* [684] Redundant Connection
*
* https://leetcode.com/problems/redundant-connection/description/
*
* algorithms
* Medium (63.65%)
* Likes: 6822
* Dislikes: 434
* Total Accepted: 528K
* Total Submissions: 798.6K
* Testcase Example: '[[1,2],[1,3],[2,3]]'
*
* 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.
*
*
*/
// @lc code=start
class UnionFind {
private:
vector<int> parent;
vector<int> rank;
public:
UnionFind(int n) {
parent.resize(n + 1);
rank.resize(n + 1);
for (int i = 0; i <= n; ++i) {
parent[i] = i;
rank[i] = 1;
}
}
int find(int x) {
if(parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void merge(int n1, int n2) {
int p1 = find(n1);
int p2 = find(n2);
if(p1 == p2) return;
if(rank[p1] > rank[p2]) {
parent[p2] = p1;
rank[p1] += rank[p2];
} else {
parent[p1] = p2;
rank[p2] += rank[p1];
}
}
};
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int n = edges.size();
UnionFind uf(n);
for (const auto& edge : edges) {
if (uf.find(edge[0]) == uf.find(edge[1])) {
return edge;
}
uf.merge(edge[0], edge[1]);
}
return {};
}
};
// @lc code=end
- T:
- S: