1579. Remove Max Number of Edges to Keep Graph Fully Traversable
T: O(mn + mlogm), m is edges len, sort)
S: O(n)
can't only cal removed edges -> 有些會漏掉
so we cal minRequiredEdges to build a graph (the edge is able to union)
class Solution {
private static final int ALICE = 1;
private static final int BOB = 2;
private static final int BOTH = 3;
public int maxNumEdgesToRemove(int n, int[][] edges) {
Arrays.sort(edges, (a, b) -> b[0] - a[0]);
UnionFind alice = new UnionFind(n);
UnionFind bob = new UnionFind(n);
int minRequiredEdges = 0;
for (int[] edge : edges) {
int type = edge[0];
if (type == BOTH) {
boolean a = alice.union(edge[1], edge[2]); // use ||, need to run union first,
boolean b = bob.union(edge[1], edge[2]); // or one of these 2, is true, will immediately return true
if (a || b) { // and not execute b
minRequiredEdges++;
}
} else if (type == ALICE) {
if (alice.union(edge[1], edge[2])) {
minRequiredEdges++;
}
} else {
if (bob.union(edge[1], edge[2])) {
minRequiredEdges++;
}
}
}
if (alice.isFullyConnected() && bob.isFullyConnected()) {
return edges.length - minRequiredEdges;
}
return -1;
}
}
class UnionFind {
int[] parent;
int count;
UnionFind(int n) {
parent = new int[n+1];
for (int i = 0; i <= n; i++) {
parent[i] = i;
}
count = n;
}
public boolean union(int x, int y) {
int i = find(x);
int j = find(y);
if (i != j) {
parent[i] = j;
count--;
return true;
}
return false;
}
public int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
public boolean isFullyConnected() {
System.out.println("count:" + count);
return count == 1;
}
}
/**
add 3 first ->
if is able to union -> means a nessasary union
add edges
if both can fully connected ->
at last cal all edges - min nessasary edges = removed edges
if can't fully connected either, return -1
T: O(n + mlogm), m is edges len, sort)
S: O(n)
*/
Last updated