题目地址:
https://leetcode.com/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/description/
有一个 n n n个顶点的无向图,给出图中的 e e e条边,问有多少个点对是不连通的。 ( a , b ) (a,b) (a,b)和 ( b , a ) (b,a) (b,a)视为同一个点对。
先用并查集统计一下每个连通块的点数,设点数为 v i v_i vi,则答案为 1 2 ∑ i v i ( n − v i ) \frac{1}{2}\sum_i v_i(n-v_i) 21i∑vi(n−vi)代码如下:
class Solution {
public:
using ll = long long;
ll countPairs(int n, vector<vector<int>>& es) {
vector<int> p(n), sz(n, 1);
for (int i = 0; i < n; i++) p[i] = i;
function<int(int)> find = [&](int x) {
if (x != p[x]) p[x] = find(p[x]);
return p[x];
};
for (auto& e : es) {
int px = find(e[0]), py = find(e[1]);
if (px != py) {
p[px] = py;
sz[py] += sz[px];
}
}
ll res = 0;
for (int i = 0; i < n; i++)
if (i == p[i]) res += (ll)sz[i] * (n - sz[i]);
return res / 2;
}
};
时间复杂度