1319. 连通网络的操作次数
分类:图论、并查集
一条边如果连接的是同一集合的两个点,那么待使用边++
将已经联通的集合看成点,每减少一个未连通点需要一条待使用边
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 makeConnected(int n, vector<vector<int>>& connections) {
UnionFind u(n);
int useless=0;
for(vector<int>& conn : connections){
if(!u.connect(conn[0], conn[1])){
useless++;
}
}
// cout << "useless: " << useless << " member: " << u.member;
return u.member-useless<=1 ? u.member-1 : -1;
}
};/* 95% **/
2021/01/23