【Leetcode】2316. Count Unreachable Pairs of Nodes in an Undirected Graph

题目地址:

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) 21ivi(nvi)代码如下:

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;
  }
};

时间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值