Tarjan缩点
用这篇博客记录一下学习Tarjan缩点的风风雨雨
三种缩点的时间复杂度均为$\Large{O(n+m)}$
定义:
$\mathrm{dfn[x]}$时间戳:表示遍历到$x$之前遍历过多少个点
$\mathrm{low[x]}$追溯值:表示从$x$出发在不经过父子边的情况下能到达的最早的祖先的$\mathrm{dfn[x]}$值。
有向图
强联通分量缩点(SCC)
SCC的作用是将一个有向有环图的环缩成一个点,使其形成一个DAG,方便后续的运算。
伪代码
1 | Tarjan(当前节点): |
Model Code
1 |
|
无向图
无向图有两个缩点方式:点双 和 边双;
解释一下两者的区别:
点双 | 边双 | |
---|---|---|
定义 | 在一张联通的无向图中,对于两个点$u$和$v$,如果无论删去哪个点($u$和$v$本身除外),都不能使它们不联通,我们就说$u$和$v$点双联通 | 在一张联通的无向图中,对于两个点$u$和$v$,如果无论删去哪条边,都不能使它们不联通,我们就说$u$和$v$边双联通 |
性质 | 图中任意一个割点都在至少两个点双中 任意一个不是割点的点都只存在于一个点双中 |
割边不属于任意边双,而其它非割边的边都属于且仅属于一个边双。 对于一个边双中的任意两个点,它们之间都有至少两条边不重复的路径。 |
点双联通分量缩点(v-DCC)
伪代码
1 | int 根(当前进入时的根) |
这个点不是割点,但没有孩子能走到他的祖先节点,若不特判将被判成割点
这个点是割点,因为它有两个孩子
Model Code
1 |
|
边双联通分量缩点(e-DCC)
1 | Tarjan(当前节点, 入边): |
1 |
|