圆方树

双连通分量的一个应用。

思想

将图中的每个 \(vBCC\) 抽象成一个点并编号(可以从 \(n+1\) 开始),这里我们规定原图中的点为圆点\(vBCC\) 形成的点是方点。于是在求 \(vBCC\) 的时候,每求出一个 \(vBCC\) 并将点弹栈的时候,就将这些圆点向对应的方点连无向边即可。
若原图不联通,则每个子图形成一棵圆方树,最后形成一个森林。

性质

其最大的性质就是将一个图变成了一棵树。这就是很多图上算法所希望的,当图变成了树,往往能使得问题简单化,和进行缩点是一个道理。

具体而言:

  1. 圆方树上,度大于 \(1\) 的点即为原图的割点。
  2. 两个点在原图中路径的必经点就是圆方树上两点之间简单路径上的割点。

注意

因为一个图中的 \(vBCC\) 数量不大于 \(n\),那么一棵圆方树就最多有 \(2n\) 个点,开数组时尤其注意开两倍

例题

基础

P5058 [ZJOI2004] 嗅探器

转化为求给定两点之间路径上割点的最小编号。
因为只需要知道 \(s,t\) 所在分量的信息,所以可以只从 \(s\) 跑一次 \(tarjan\),此时如果 \(t\) 的信息没变则代表 \(s,t\) 不连通,无解。
最后 \(dfs\) 求答案时可以从 \(s\) 开始跑,向 \(dfs\) 中传入参数 \(ans\),实时更新这条路上的答案。中间可以利用性质 \(1\) 判断该点是否为割点。因为两点在圆方树上路径唯一,跑到 \(t\) 直接输出即可。

posted @ 2025-11-17 19:13  Sqqqz185  阅读(2)  评论(0)    收藏  举报