描述
给一个无向连通图, 求所有割边. (割边: 去掉这条边, 联通分量就会变成多个)
思路
tarjan
算法模板题. dfn
数组表示正常dfs的遍历顺序(存的值可以看做时间戳), low
数组表示该点不通过父节点能访问到的最小(时间戳)祖先节点. low[v] > dnf[u]
时, 说明v-u
是割边.(可以这么想, 我们从v
走到u
, v
之前有很多时间戳比v
小的祖先节点, 现在从u
出发不经过v
, 到达的最小时间戳也比u
大, 说明(断开当前边的话)够不到之前的节点, 联通分量++)
这个博客讲的很好, 懒得复述一遍了: https://www.cnblogs.com/nullzx/p/7968110.html
关于tarjan
找有向图强连通分量: https://www.cnblogs.com/tgycoder/p/5048898.html
当dfn(u)=Low(u)
时,以u
为根的搜索子树上所有节点是一个强连通分量. 结论化: 在一个强连通分量中有且仅有一个点的dfn
与low
相等. (她是这个强连通分量的入口节点).
求有向图强连通分量的意义: 由于强连通分量内部的节点性质相同,可以将一个强连通分量内的节点缩成一个点, 即消除了环, 这样, 原图就变成了一个有向无环图(directed acyclic graph,DAG).tarjan
求割边模板:
1 | def tarjan(u): |
tarjan
求有向图所有强连通分量模板:
1 | inStack = [0] * (1 + n) |
代码
求割边:
1 | class Solution(object): |
求强连通分量(套的本题框架)
1 | class Solution(object): |