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

你可能感兴趣的:(算法题目,算法,图论,c++)