4. Redundant Connection

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.

Input: edges = [[1,2],[1,3],[2,3]]
Output: [2,3]
Input: edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]
Output: [1,4]

Solution: (Union find)

class Solution
{
public:
    int findPar(vector<int> &v, int node)
    {
        if (v[node] == -1)
        {
            return node;
        }

        v[node] = findPar(v, v[node]);
        return v[node];
    }

    void uni(vector<int> &v, vector<int> &rank, int parA, int parB)
    {
        if (parA != parB)
        {

            if (rank[parA] > rank[parB])
            {
                v[parB] = parA;
            }
            else if (rank[parB] > rank[parA])
            {
                v[parA] = parB;
            }
            else
            {
                v[parA] = parB;
                rank[parB]++;
            }
        }

        return;
    }

    vector<int> findRedundantConnection(vector<vector<int>> &edges)
    {
        int n = edges.size();

        vector<int> res(2);

        vector<int> v(n + 1, -1);
        vector<int> rank(n + 1, 0);

        for (int i = 0; i < edges.size(); i++)
        {
            int a = edges[i][0];
            int b = edges[i][1];

            int parA = findPar(v, a);
            int parB = findPar(v, b);

            if (parA != parB)
            {
                uni(v, rank, parA, parB);
            }
            else
            {
                res[0] = a;
                res[1] = b;
            }
        }

        return res;
    }
};

Last updated