# 684_Redundant_Connection ###### tags: `leetcode` ## Problem Statement 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. ## Solution - To solve this case is equivalent to finding a loop in the graph. - There are many algorithm for finding a loop, like DFS, BFS. But for this question, the fastest way is to use ```DSU (Disjoint Set Union)```. ### DSU - To complete this, there are 2 elements to remember: ```join```, ```union```. - join: find the parent root of the current set. - union: if the two dots are from different sets, they need to be combined. ```cpp= int find(int x) { if (x != par[x]) par[x] = find(par[x]); return par[x]; } void uniun(int x, int y) { par[find(y)] = find(x); } ``` - First ocnstruct new set if there are no dots in the existing set. - If the two dots for the edges are in different set (they have different root parent in ```find```), they need to union. - If the two dots are in the same set (they have the same parents), they are the dirst edges to form a group. ```cpp= class Solution { public: vector<int> findRedundantConnection(vector<vector<int>>& edges) { par.resize(edges.size()+1); for (int i = 0; i < par.size(); i++) par[i] = i; for (auto& e : edges) if (find(e[0]) == find(e[1])) return e; else uniun(e[0],e[1]); return edges[0]; } private: vector<int> par; int find(int x) { if (x != par[x]) par[x] = find(par[x]); return par[x]; } void uniun(int x, int y) { par[find(y)] = find(x); } }; ```