栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

leetcode:684. 冗余连接【我的简单判断联通分量 + 官方的python并查集模板】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode:684. 冗余连接【我的简单判断联通分量 + 官方的python并查集模板】

我的分析

如果要去掉还是树,那么去掉之后一定是联通分量为1的
因此维护一个neighbour并在遍历某个edge时先remove后add回来即可
然后看联通分量是否为1

my ac code
class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        # 去掉之后联通分量仍然是1即可
        nodes = set()
        neighbour = defaultdict(list)
        for x, y in edges:
            neighbour[x].append(y)
            neighbour[y].append(x)
            nodes.add(x)
            nodes.add(y)
        n = len(nodes)
        ans = None
        visit = [False] * n

        # 联通分量走完
        def dfs(node):
            nonlocal visit
            visit[node - 1] = True
            for child in neighbour[node]:
                if visit[child - 1] is False:
                    dfs(child)
        
        for x, y in edges:
            visit = [False] * n
            # 更新一下neighbour
            neighbour[x].remove(y)
            neighbour[y].remove(x)
            # 遍历所有点
            cnt = 0
            for node in range(1, n + 1):         
                if visit[node - 1] is False:
                    dfs(node)
                    cnt += 1
            #print(cnt)
            if cnt == 1:
                ans = [x, y]
            # 更新一下neighbour
            neighbour[x].append(y)
            neighbour[y].append(x)
        
        return ans
官方


意思是如果不是同一个联通分量就合并 否则就是多余的边

官方 ac code
class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        n = len(edges)
        parent = list(range(n + 1))

        def find(index: int) -> int:
            if parent[index] != index:
                parent[index] = find(parent[index])
            return parent[index]
        
        def union(index1: int, index2: int):
            # 后者作为爸爸
            parent[find(index1)] = find(index2)

        for node1, node2 in edges:
            if find(node1) != find(node2):
                union(node1, node2)
            else:
                # 出现环 也就是破坏它是树的最后一条边
                return [node1, node2]
        
        return []
总结

万万没想到
py的并查集这么简洁
如果两个点已经同属一个联通分量 那么当前这条边就是最后的罪魁祸首

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/864870.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号