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
相关推荐
0思必得013 分钟前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
-dzk-14 分钟前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
韩立学长20 分钟前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
qq_1927798723 分钟前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
风筝在晴天搁浅23 分钟前
hot100 78.子集
java·算法
Jasmine_llq26 分钟前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪40 分钟前
快速进制转换
笔记·算法
u01092727141 分钟前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊43 分钟前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
m0_706653231 小时前
C++编译期数组操作
开发语言·c++·算法