DDSA Solutions

1579. Remove Max Number of Edges to Keep Graph Fully Traversable

Problem Overview

Maximize edges removed while keeping the graph fully connected.

Advertisement

Intuition

Maximize edges removed while keeping the graph fully connected. Use two Union-Finds (one per user). Add type 3 edges first (both benefit). Then greedily add type 1 and 2.

Algorithm

  1. 1Process type 3 edges first, union in both UF1 and UF2. Count redundant type 3 edges.
  2. 2Process type 1 with UF1, type 2 with UF2. Count redundant edges.
  3. 3If both UFs are fully connected, return total redundant edges. Else -1.

Common Pitfalls

  • Process shared edges first for maximum sharing. Redundant = edge added when both endpoints already connected.
1579.cs
C#
// Approach: Dual Union-Find for Alice and Bob; process type-3 edges first (shared), then type 1/2; count unused.
// Time: O(E α(n)) Space: O(n)

public class Solution
{
    public int MaxNumEdgesToRemove(int n, int[][] edges)
    {
        var alice = new DisjointSet(n);
        var bob = new DisjointSet(n);

        int removedEdges = 0, aliceEdges = 0, bobEdges = 0;
        Array.Sort(edges, (a, b) => b[0] - a[0]);

        foreach (int[] edge in edges)
        {
            int type = edge[0];
            int u = edge[1];
            int v = edge[2];

            if (type == 3)
            {
                if (alice.unionBySize(u, v))
                {
                    bob.unionBySize(u, v);
                    aliceEdges++;
                    bobEdges++;
                }
                else
                    removedEdges++;
            }
            else if (type == 2)
            {
                if (bob.unionBySize(u, v))
                    bobEdges++;
                else
                    removedEdges++;
            }
            else
            {
                if (alice.unionBySize(u, v))
                    aliceEdges++;
                else
                    removedEdges++;
            }
        }

        return (bobEdges == n - 1 && aliceEdges == n - 1) ? removedEdges : -1;
    }
}

class DisjointSet
{
    public List<int> parent = new List<int>();
    public List<int> size = new List<int>();
    public DisjointSet(int n)
    {
        for (int i = 0; i <= n; i++)
        {
            parent.Add(i);
            size.Add(1);
        }
    }

    public int findUPar(int node)
    {
        if (node == parent[node])
            return node;

        return parent[node] = findUPar(parent[node]);
    }

    public bool unionBySize(int u, int v)
    {
        int ulp_u = findUPar(u);
        int ulp_v = findUPar(v);

        if (ulp_u == ulp_v)
            return false;

        if (size[ulp_u] < size[ulp_v])
        {
            parent[ulp_u] = ulp_v;
            size[ulp_v] += size[ulp_u];
        }
        else
        {
            parent[ulp_v] = ulp_u;
            size[ulp_u] += size[ulp_v];
        }

        return true;
    }
}
Advertisement
Was this solution helpful?

Related Problems