1579. 保证图可完全遍历
分类:图论、并查集
type3
对两个图都可用,优先考虑;再分别构建两个图就行
意外地不像一个hard
class UnionFind{
private:
vector<int> u;
vector<int> sz;
public:
int member;
UnionFind(int n):member(n), u(n), sz(n, 1){
iota(u.begin(), u.end(), 0);
}
int root(int i){
return u[i] == i ? i : u[i] = root(u[i]);
}
bool connect(int i, int j){
int ri = root(i), rj = root(j);
if(ri == rj){
return false;
}
if(sz[ri] < sz[rj]){
swap(ri, rj);
}
u[rj] = ri;
sz[ri] += sz[rj];
member--;
return true;
}
};
class Solution {
public:
int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {
if(edges.size() == 0) return 0;
UnionFind alice(n+1), bob(n+1);
alice.connect(0, 1); bob.connect(0, 1);
int cnt=0;
for(vector<int>& edge : edges){
if(edge[0]!=3) continue;
if(alice.connect(edge[1], edge[2])) bob.connect(edge[1], edge[2]);
else cnt++;
}
for(vector<int>& edge : edges){
if(edge[0]==1 && !alice.connect(edge[1], edge[2])){
cnt++;
}else if(edge[0]==2 && !bob.connect(edge[1], edge[2])){
cnt++;
}
}
return (alice.member==1&&bob.member==1 ? cnt : -1);
}
};/* 84% **/
2021/01/27