class Solution {
public int makeConnected(int n, int[][] connections) {
int size = connections.length;
if (connections.length < n - 1) return -1;
Union uf = new Union(n);
for (int[] conn : connections) {
uf.unite(conn[0], conn[1]);
}
return uf.setCount - 1;
}
}
class Union {
int[] f;
//孩子个数
int[] size;
int n;
//当前连通分量数目
int setCount;
public void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
public Union(int n) {
this.n = n;
this.setCount = n;
this.f = new int[n];
this.size = new int[n];
Arrays.fill(size, 1);
for (int i = 0; i < n; i++) f[i] = i;
}
int find(int x) {
if (x == f[x]) return f[x];
return f[x] = find(f[x]);
}
boolean unite(int x, int y) {
x = find(x);
y = find(y);
//如何两个点已经连通,就返回false,不会再执行以下代码
if (x == y) return false;
if (size[x] < size[y]) swap(x, y);
f[y] = x;
size[x] += size[y];
--setCount;
return true;
}
boolean connected(int x, int y) {
return find(x) == find(y);
}
}
leetcode1319. 连通网络的操作次数
最新推荐文章于 2024-06-12 10:00:23 发布