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
相关推荐
Metaphor69226 分钟前
使用 Python 在 Word 文档中添加批注
python·word
FreakStudio33 分钟前
WIZnet 开源方案分享:W55MH32 开发板 + 小智 AI实现以太网版本的小智机器人
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
会周易的程序员35 分钟前
使用 pybind11 封装 C++ 日志库 microLog 为 Python 模块
java·c++·python·物联网·架构·日志·aiot
一只专注api接口开发的技术猿1 小时前
电商评论自动化监控与情感数据分析完整落地教程(附可直接运行 Python 代码)
大数据·数据库·python·数据分析·自动化
Fox爱分享1 小时前
字节二面:1000瓶酒,有一瓶是毒药,多少只老鼠可以查出来?
算法·面试·程序员
HAPPY酷1 小时前
【ROS2】 Conda 环境搭建(命令行版)
linux·运维·python·ubuntu·机器人·conda
+wacyltd大模型备案算法备案1 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记
Fox爱分享1 小时前
字节二面智力题:100只老虎和1只羊关在一起,这只羊会不会被吃?
算法·面试·程序员
xin(n_n)b2 小时前
经典题目(3):把数字翻译成字符串;兑换零钱
算法
惊鸿一博2 小时前
特征匹配+Glue Factory 框架评估特征提取与匹配算法时常用的度量标准
算法·特征匹配