题目链接:Luogu P3388 【模板】割点(割顶)
题目描述:
给定一张无向图,输出割点个数以及割点编号。
割点的定义:删除一个点及其连接的边后,若能使图的联通块数量增加,那么被删除的这个点叫做割点。
题解:
使用
Tarjan
算法即可,也就是利用DFS
序来解决,DFS
能够建立一棵DFS
树,我们需要在DFS
的过程中记录结点u
被访问的时间dfn[u]
,以及与结点u
相连的结点v
(不包含父亲边,除非存在重边)中dfn[v]
的最小值low[u]
。
经过上述的操作后,对于非根节点结点u
,如果u
的某个儿子结点v
满足low[v] < dfn[u]
则说明可以从结点u
可以走到v
并从v
出发通过某条边回到某个先于u
遍历的结点,也就是删除u
结点后,v
结点不会产生新的联通块,如果所有的儿子结点均满足上述的条件,u
一定不是割点。而如果存在某个儿子结点v
满足low[v]>=dfn[u]
则说明v
这个结点所在的联通块不能与之前某个遍历的结点相连,也就是说u
此时是割点。对于根节点,容易发现只要其有至少两个儿子结点则其是割点。
代码:LuoguP3388