Tarjan
Posted cjoiershiina-mashiro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tarjan相关的知识,希望对你有一定的参考价值。
有向图的强连通分量:两个点如果能够相互到达,那么称他们相互强连通。若一个有向图的所有点对都是相互强连通的,那么称之为强连通图。一个有向图的极大强连通子图称为该图的强连通分量。
无向图的割点/边:去掉该点/边之后无向图的连通性发生改变的点/边称为割点/边。
无向图的点/边双连通分量:若一个无向图不存在割点/边,则称作点/边双连通图。一个无向图的极大点/边双连通子图称为该图的点/双连通分量。
强连通分量记为scc,点双连通分量记为v-dcc,边双连通分量记为e-dcc,双连通分量统一记为dcc。
缩点
遍历到时把点加入栈。
然后如果回溯到某个点时(low_u=dfn_u),那么我们栈上面的一部分(弹完(u)为止)就是一个scc。
注意Tarjan求出来的scc编号恰好是拓扑序反序。
我们可以把每个scc缩成一个点,那么我们可以得到一个DAG。
然后我们就可以在这个DAG上面根据拓扑序DP了。
割点
如果一个点(u)存在一个出点(v),满足(low_vge dfn_u),那么(u)就是该图的一个割点。
如果是dfs的根节点,那么需要存在两个触点满足上述条件才是一个割点。
而两个v-dcc之间由割点连接,而且有且仅有一个割点。
所以一个割点可能属于多个v-dcc。
v-dcc的维护需要圆方树,这里就不做研究了。
割边(桥)
如果一条边((u,v))满足(low_v>dfn_u)(dfs过程中(v)不能走到(u)),那么((u,v))就是该图的一条割边。
把割边都去掉之后剩下的就是e-dcc,每个e-dcc都是一个连通块。
我们可以把一个e-dcc缩成一个点,而割边看做一条边,那么我们可以得到一颗树。
得到树能做什么就不用我说了吧。
LCA?
这东西有用?.jpeg
以上是关于Tarjan的主要内容,如果未能解决你的问题,请参考以下文章