Two DSUs, shared edges first
Time O(E α(n)) Space O(n)Process type 3 edges into both DSUs (count once if useful), then type 1 into Alice's, type 2 into Bob's. If either isn't connected, −1. Otherwise answer = edges − used.
class Solution {
public int maxNumEdgesToRemove(int n, int[][] edges) {
int[] alice = new int[n + 1], bob = new int[n + 1];
for (int i = 0; i <= n; i++) { alice[i] = i; bob[i] = i; }
int used = 0, aliceParts = n, bobParts = n;
for (int[] e : edges)
if (e[0] == 3 && union(alice, e[1], e[2])) {
union(bob, e[1], e[2]);
used++; aliceParts--; bobParts--;
}
for (int[] e : edges) {
if (e[0] == 1 && union(alice, e[1], e[2])) { used++; aliceParts--; }
if (e[0] == 2 && union(bob, e[1], e[2])) { used++; bobParts--; }
}
return aliceParts == 1 && bobParts == 1 ? edges.length - used : -1;
}
private boolean union(int[] parent, int a, int b) {
int ra = find(parent, a), rb = find(parent, b);
if (ra == rb) return false;
parent[ra] = rb;
return true;
}
private int find(int[] parent, int x) {
while (parent[x] != x) { parent[x] = parent[parent[x]]; x = parent[x]; }
return x;
}
}Verdict: Greedy order is the key.