力扣每日一题+python知识点回顾(四)

力扣题目:统计无向图中无法互相到达点对数(题号:2316)

给你一个整数n,表示一张无向图中有n个节点,编号为0到n-1。同时给你一个二维整数数组edges ,其中edges[i]=[ai,bi]表示节点ai和 bi之间有一条无向边。

请你返回无法互相到达的不同点对数目

示例一:

示例一图

输入:n = 3, edges = [[0,1],[0,2],[1,2]]
输出:0
解释:所有点都能互相到达,意味着没有点对无法互相到达,所以我们返回 0 。

示例二:

示例二图

输入:n = 7, edges = [[0,2],[0,5],[2,4],[1,6],[5,4]]
输出:14
解释:总共有 14 个点对互相无法到达:
[[0,1],[0,3],[0,6],[1,2],[1,3],[1,4],[1,5],[2,3],[2,6],[3,4],[3,5],[3,6],[4,6],[5,6]]
所以我们返回 14 。

编程思路:深度优先搜索

由于是无向图,我们首先用二维列表保存图,然后使用深度有先搜索的方式,找出每一个连通分量中的节点个数num,然后将当前连通分量的节点个数num与之前连通分量的节点个数总和sum相乘,即可得到当前连通分量中的不可达点对数目,然后将这个数目加到ans中,继续搜索下一个连通分量,直到搜索完所有连通分量,直到搜索完所有连通分量。

编程代码:

class Solution:
    def countPairs(self, n: int, edges: List[List[int]]) -> int:
        g = [[] for _ in range(n)]
        ans = sum = 0 # sum计录之前区块的点数
        visit = [False] * n
        for u,v in edges:
            g[v].append(u)
            g[u].append(v)

        def dfs(x: int) -> int:
            visit[x] = True 
            num = 1 #记录当前区块点数
            for y in g[x]:
                if not visit[y]:
                    num += dfs(y)
            return num

        for i in range(n):
            if not visit[i]:
                num = dfs(i)
                ans += sum * num
                sum += num
        return ans
posted @ 2023-10-23 19:41  风雪无常  阅读(12)  评论(0编辑  收藏  举报