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
相关推荐
Tisfy2 分钟前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
计算机毕业编程指导师3 分钟前
【Python毕设选题推荐】基于Hadoop+Django的奥斯卡奖获奖数据可视化分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·毕业设计·课程设计·奥斯卡奖
风早爽太4 分钟前
Python 学习笔记:数据库迁移工具 ‌Alembic
数据库·python·fastapi·alembic
小O的算法实验室6 分钟前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
外收内放7 分钟前
06 | 优化篇① 游戏改名《鳞光纪》了:这次翻新,把“脸“全换了
python·游戏·pygame
Liuchang091110 分钟前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
计算机毕业编程指导师11 分钟前
【大数据毕设选题】基于Spark的电信网络诈骗话术语义特征挖掘分析系统源码 毕业设计 选题推荐 数据分析 机器学习 深度学习
大数据·hadoop·python·spark·毕业设计·课程设计·网络诈骗
for_ever_love__15 分钟前
电商订单数据清洗实战——Pandas 处理缺失值、重复单与异常金额
python·数据分析·pandas·数据清洗
计算机毕业编程指导师16 分钟前
计算机大数据毕设怎么选?基于Spark的个体肥胖健康风险评估的数据分析与可视化系统带你通关 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·spark·毕业设计·肥胖风险
坤坤子吖17 分钟前
Python基础语法学习:函数
开发语言·笔记·python·学习