题目地址:
https://leetcode.com/problems/number-of-operations-to-make-network-connected/
给定 n n n个点,编号 0 ∼ n − 1 0\sim n-1 0∼n−1,再给定若干条边,要求修改其中某些边,使得所有点连通。问至少要修改多少条边。若无论怎么修改都连通不了,则返回 − 1 -1 −1。
如果边数小于 n − 1 n-1 n−1,则无解,因为 n n n阶树需要 n − 1 n-1 n−1条边。否则的话,可以先用并查集求一下一共有多少个连通块,这些连通块个数减 1 1 1即为所求。代码如下:
class Solution {
public:
vector<int> p;
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int makeConnected(int n, vector<vector<int>>& es) {
if (es.size() < n - 1) return -1;
p.resize(n);
for (int i = 0; i < n; i++) p[i] = i;
for (auto& e : es) {
int x = e[0], y = e[1];
int px = find(x), py = find(y);
if (px != py) {
p[px] = py;
n--;
}
}
return n - 1;
}
};
时间复杂度 O ( n log ∗ n ) O(n\log ^*n) O(nlog∗n),空间 O ( n ) O(n) O(n)。