有向图的强连通分量:两个点如果能够相互到达,那么称他们相互强连通。若一个有向图的所有点对都是相互强连通的,那么称之为强连通图。一个有向图的极大强连通子图称为该图的强连通分量。
无向图的割点/边:去掉该点/边之后无向图的连通性发生改变的点/边称为割点/边。
无向图的点/边双连通分量:若一个无向图不存在割点/边,则称作点/边双连通图。一个无向图的极大点/边双连通子图称为该图的点/双连通分量。
强连通分量记为scc,点双连通分量记为v-dcc,边双连通分量记为e-dcc,双连通分量统一记为dcc。
缩点
遍历到时把点加入栈。
然后如果回溯到某个点时\(low_u=dfn_u\),那么我们栈上面的一部分(弹完\(u\)为止)就是一个scc。
注意Tarjan求出来的scc编号恰好是拓扑序反序。
我们可以把每个scc缩成一个点,那么我们可以得到一个DAG。
然后我们就可以在这个DAG上面根据拓扑序DP了。
割点
如果一个点\(u\)存在一个出点\(v\),满足\(low_v\ge 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