P5058 嗅探器
P5058 嗅探器
问题
P5058 [ZJOI2004] 嗅探器
蓝军网络中有两个信息中心,两个中心之间可能存在多条不同的数据传输路线。需要选择一台既不是信息中心的中间服务器安装嗅探器,使两个中心之间交换的所有数据都必然经过它;若有多个选择则输出编号最小者,若不存在则输出 No solution。
数据规模:,边数不超过 。
找图上某一点使得源点和汇点的所有路线都经过它。
但如果直接求整张图的所有割点再取最小编号是错误的,因为一个割点可能只切断与 无关的支路。所以真正需要判断的是删除某个节点后,指定的两个信息中心是否断开。
以 为 DFS 根,考虑祖先节点 通向 的那个 DFS 树儿子 。当且仅当 时, 的整棵子树无法绕过 回到 的祖先,因此删除 会切断 与位于该子树中的 。
我的做法是在 tarjan(v) 刚返回时用 dfn[b] >= dfn[v] 判断 是否位于 子树。因为递归返回时,当前子树中的时间戳连续且不小于 dfn[v],尚未搜索的兄弟分支时间戳为 ,已经结束的其他分支时间戳又更小,因此这里成立。这个判断依赖“刚从该儿子返回”的时机,若把统计移到 DFS 结束以后,就应额外记录子树时间戳区间。
最后特判节点 与 都不能作为中间服务器,按编号扫描标记即可得到最小解。
Tarjan 的时间复杂度为 ,空间复杂度为 。
▶
P5058 嗅探器
1 | |
记录
-
归属:割点、指定两点连通性;
-
新增:整图割点不等于指定两点之间的必经点;必须只检查 DFS 树上通向目标点的分支,并使用该分支根的
low。 -
分类:待定
P5058 嗅探器
http://miqiu.space/posts/p5058001/