LC1319.连通网络的操作次数
思路:并查集
- 并查集模板题
- 什么时候会无法充分连接?给的线数量太少了,只要线的数量足够多,那么一定可以连接全部的机器。所以,如果
connections.size() < n - 1
,就不行,否则就足够连接。 逐个连接即可。最后数堆的数量。
set_count
记录堆的数量,每次连接,则set_count - 1
,最后剩下的set_count
就是连接的总数量。代码:
```cpp // 并查集模板 class UnionFind { public: vector
fa; vector r; int n; // 当前连通分量数目 int set_count;
public: UnionFind(int _n): n(_n),set_count(_n), fa(_n), r(_n, 1) { iota(fa.begin(), fa.end(), 0); }
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
if (r[x] <= r[y]) {
fa[x] = fa[y];
} else {
fa[y] = fa[x];
}
if (r[x] == r[y]) {
r[y] += 1;
}
set_count -= 1;
}
}
};
class Solution {
public:
int makeConnected(int n, vector
UnionFind uf(n);
for (const auto& conn: connections) {
uf.merge(conn[0], conn[1]);
}
// 已经提前判断了,直接返回即可
return uf.set_count - 1;
}