割点 Tarjan 算法
最近学习图论,写篇题解记录一下。
定义
- 对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点(又称割顶)。
这篇博客主要介绍,Tarjan 算法用于求 割点。
割点
Tarjan 算法,记录 节点访问时间戳 dfn
,节点能够回溯到的最早的点的时间戳 low
。
对于某一点:
- 如果这个点是根节点,且有两个以上与它相连的连通分量,那这个点就是割点。
- 如果某个点后继是一个连通分量,而这个点不是根节点,那这个点是割点。
第一种情况
我们需要记录根节点 fa
,在遍历的时候,如果重复访问到了 fa
,说明找到了 fa
下面的一个连通分量。
第二种情况
设当前点 s
,对于访问的下一个节点 y
:
如果 low[y] >= dfn[s]
,说明这个点下面有一个连通分量。
注:这里类似于 Tarjan 求 SCC 时,我们所做的 min(low[s],dfn[y])
。
代码
1 | void tarjan(int s, int fa){ |