割点

割点

割点:在一个无向图中,如果删除这个顶点,这个图就不再连通


和之前的割边类似
图可以看成一棵树上在连上一些边,分为原有的树边,和非树边
\(dfn\) 记录时间戳,当前点的访问时间
\(low\) 记录当前点可以回到的最小的点的编号
\(tarjan\) , 一个点去遍历他的出边

  • 如果目标点没有被访问过就直接过去, 然后更新 \(low\) 值, 尝试通过这个点回到更小的点。
    然后要判断, 如果目标点的 \(low\)\(\ge\) 当前点的 \(dfn\) , 说明目标点在不经过当前点的情况下最好也只能回到当前点, 所以当前点这就是个割点

  • 否则,说明找到了回去的路,也就是一条非树边,更新的点的 \(low\) 值为目标点的 \(dfn\)而不是 \(low\)

仅仅只是像上面那样做是错的, 因为第一个遍历的点无论怎么返回,最小的编号都一定是自己,所以就一定会把每一个联通块内的第一个点判断成割点, 这时不对的。

所以可以在每一次 \(tarjan\) 进入前先记录这个进入点的编号

对于割点的判断出了要满足原有的条件,他还要满足他要不是第一个进入的点, 树根

然后对于这个根单独判断

  • 如果他以树边连接的儿子\(\leq\) 2 个, 那么把这个点干掉不会影响联通块数量

  • 否则如果这个点被干掉,那么它的儿子就无法联通了,所以这就是个割点

然后就做完了

B4309

网格上需要移除最少数量的棋子使出现两个以上的联通块(水平垂直方向的棋子处于同一联通块)


可以把这个网格当成一张图, 把上下左右相邻的棋子连边


先说一定有答案的情况
发现答案只有 \(0, 1, 2\) 这三种

  • 0 : 因为本身图中就出现了两个及以上的联通块所以不需要移除棋子
  • 1: 因为图中有 割点,这时只要把割点一切,这个联通块就会变成两个及以上
  • 2: 说明图中只有一个联通块,而且没有割点。 但是这时一定有图中的一个角, 把它与图相连的两个点移除,就可以把他分离出来,这时就有两个联通块了。 比如样例1, 他们连成一坨, 就可以先把左上角的那个 \((1,2)\)隔离出来,就可以移除\((1,3),(2,2)\)
L G G
L G G
L L L

然后来说没有答案的情况
首先它本身不存在两个及以上的联通块
然后它的节点个数 小于等于 2 个
这样只要一移除棋子,那么就没棋子了, 根本不可能出现两个及以上的联通块


所以这题要

  • \(1.\;\) 先把图中的棋子编号,在按照相邻的棋子连边建成一张图
  • \(2.\;\) 然后尝试找割点, 顺便记录联通块的数量
  • \(3.\;\) 如果联通块数量 \(\ge 2\), 那么直接输出 \(0\)
  • \(4.\;\) 如果联通块数量 \(\leq 1\), 且点(棋子) \(\leq 2\)
  • \(5.\;\) 这时如果有割点答案就是 \(1\) , 否则答案就是 \(2\)
posted @ 2025-12-08 22:25  wmq2012  阅读(0)  评论(0)    收藏  举报