leetcode 边双连通tarjan(python)

按照tarjan寻找强连通分量的模板,稍微改一下。

先回顾一下强连通分量,首先维护dnf和low两个列表,dnf【i】表示第i个节点的编号,low【i】表示第i个节点能到达的最小节点编号。例如节点0可以到1,节点1能到达2,节点2能到达0,那么可以推出low【1】= 0。

强联通是有向图,而边双连通是无向的,那么如果某次到达了v节点,不能让他再顺着原路返回父节点u,否则low【v】肯定等于low【u】,总结就是从u节点到达v后,不能再从v到达u。

题目需要找到这个关键链接,就是找到两个点之间只存在一条边的这两个节点。

如果low【v】= dnf【v】,说明节点v不能到达v的父节点u及之前的其他节点,就是说u到v只有一条边。

python 复制代码
class Solution:
    def criticalConnections(self, n: int, connections: List[List[int]]) -> List[List[int]]:
        dnf = [0] * n
        low = [0] * n
        edge = defaultdict(list)
        ans = []
        idx = 1
        stack = []
        for x, y in connections:
            edge[x].append(y)
            edge[y].append(x)

        def tj(u, v):
            # u is father 
            # v is son
            nonlocal idx
            dnf[v], low[v] = idx, idx
            idx += 1
            for nex in edge[v]:
                if dnf[nex] == 0:
                    tj(v, nex)
                    low[v] = min(low[v], low[nex])
                elif nex != u:
                    low[v] = min(low[v], low[nex])
            if low[v] == dnf[v] and u != v:
                ans.append([u,v])

        tj(0, 0)
        return ans
相关推荐
qq_161111271 小时前
Jenkins+Python自动化测试持续集成详细教程
自动化测试·python·jenkins·教程·持续集成
octopus_c2 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
爱吃苹果的梨叔4 小时前
训练集群网络中断怎么办?智算机房的 Console 串口排障方案
网络·python·智能路由器·php
李妍.8 小时前
02Numpy基础(上)
开发语言·python
TheBestRucy8 小时前
Python 九阳神功之贰:面向对象(下)
开发语言·python
YH55269848 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
2601_965958468 小时前
口腔黏膜脱皮超2周未愈建议及时就医
人工智能·python
微小冷9 小时前
在不同空间中展示数据(欧式、球面、庞加莱圆盘)
python·双曲空间·微分几何·geomstats·庞加莱圆盘·球面
weixin_4316004410 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
遥感知识服务10 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习