7月算法训练------第十七天(广度优先搜索)解题报告

7月算法训练------第十七天(广度优先搜索)解题报告

题目类型:广度优先搜索
题目难度:简单

第一题、2316. 统计无向图中无法互相到达点对数

  1. 题目链接:2316. 统计无向图中无法互相到达点对数
  2. 思路分析:
    运用DFS,求出每个连通块的大小,同时求出变量维护前面求出的连通块之和,与当前求出的连通块之和计算乘积,然后做累加,就是答案。
    比如:题目中的例子:
    n = 7, edges = [[0,2],[0,5],[2,4],[1,6],[5,4]]
    我们通过画图可知图中连通块为[0, 2, 4, 5],[3],[1, 6],连通块个数位4,1,2;
    则计算过程就是: 0 × 0 + 1 × ( 0 + 4 ) + 2 × ( 0 + 4 + 1 ) = 14 0\times0+1\times(0+4)+2\times(0+4+1)=14 0×0+1×(0+4)+2×(0+4+1)=14
    注意用法Arrays.setAll()方法。这种思路确实不好想。
  3. 代码:
class Solution {
    List<Integer>[] g;
    boolean[] vis;
    int cnt;

    public long countPairs(int n, int[][] edges) {
        g = new ArrayList[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for (int[] e : edges) {
            int x = e[0], y = e[1];
            g[x].add(y);
            g[y].add(x);
        }
        vis = new boolean[n];
        long ans = 0L;
        for (int i = 0, tot = 0; i < n; ++i)
            if (!vis[i]) {
                cnt = 0;
                dfs(i);
                ans += (long) cnt * tot;
                tot += cnt;
            }
        return ans;
    }

    void dfs(int x) {
        vis[x] = true;
        ++cnt;
        for (int y : g[x]) if (!vis[y]) dfs(y);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值