题目链接: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