1579. Remove Max Number of Edges to Keep Graph Fully Traversable
Solutions
struct UnionFind {
vector<int> nodes;
UnionFind(int size) : nodes(size) {
iota(nodes.begin(), nodes.end(), 0);
}
int find(int node) {
return nodes[node] == node ? node : (nodes[node] = find(nodes[node]));
}
bool merge(int node1, int node2) {
int f1 = find(node1), f2 = find(node2);
if (f1 == f2) return false;
nodes[f1] = f2;
return true;
}
};
class Solution {
public:
int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {
UnionFind uf1(n + 1), uf2(n + 1);
unordered_set<int> dup;
int size1 = n, size2 = n;
auto insert1 = [&](int st, int ed, int ei) {
if (uf1.merge(st, ed))
size1--;
else
dup.insert(ei);
};
auto insert2 = [&](int st, int ed, int ei) {
if (uf2.merge(st, ed))
size2--;
else
dup.insert(ei);
};
// remove redundant edges for type 3
int ei = 0;
for (auto & e : edges) {
int st = e[1], ed = e[2], type = e[0];
if (type != 3) continue;
insert1(st, ed, ei); insert2(st, ed, ei);
ei++;
}
// remove redundant edges for type 1 or 2
// ei = 0; can be omitted, since ei must be different
for (auto & e : edges) {
int st = e[1], ed = e[2], type = e[0];
if (type == 1) insert1(st, ed, ei);
if (type == 2) insert2(st, ed, ei);
ei++;
}
// check if graphs is connected for both people
if (size1 != 1 || size2 != 1) return -1;
return dup.size();
}
};Last updated