Luogu P5058 [ZJOI2004] 嗅探器 题解 Tarjan 割点

题目链接:Luogu P5058 [ZJOI2004] 嗅探器
题目描述:

给定一张无向图,以及两个点s,t,你需要找到一个点(这个点不能是st),这个点被所有s,t之间的路径所经过。如果不存在这样的点,输出No solution。如果有多个这样的点,输出编号最小的。

题解:

我们很容易发现要删除的点一定是割点(按照题意,删除后,st不能进行通信,这说明强连通分量增加了)。我们只需要考虑哪些割点是满足条件的。如果我们以s作为根结点进行Tarjan,对于一个割点u(非st),我们不难发现t一定不能是之前遍历过的点(如果是之前遍历过的点,那么删除u后,st依然可以到达)也就是必须满足dfn[u] < dfn[t],同时如果删除u,那么对于其所有满足low[v]>=dfn[u]的儿子结点v均会产生一个新的强连通分量,如果t在这些新产生的联通分量中的某一个,那么u明显是满足条件的(删除u后,t将与s不可达),t在这些联通分量中的一个也就是t是某个v结点或者在v的子树中,即满足dfn[t] >= dfn[v]。不难发现如果满足dfn[t] >= dfn[v]那么dfn[t] > dfn[u]一定是成立的,因此只需要判断非st的割点是否存在某个儿子v满足dfn[v]<=dfn[t]即可。

代码:LuoguP5058

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值