题目链接:POJ 1523 SPF
题目描述:
给定一张连通的无向图,问哪些结点是割点,分别删除各个割点时会产生几个强连通分量。
题解:
求割点可以通过
Tarjan
算法来解决,我们接下来考虑删除一个割点后会产生多少个联通块。
在Tarjan
算法中,我们判断一个点是否是割点是通过其子结点能否回到遍历过的结点来判断。如果当前遍历的结点存在一个子结点不能够回到已经遍历过的结点,那么当前遍历的结点便是一个割点(这样的依据是删除当前的结点后,这个不能回到遍历过的结点的子节点会变成一个新的强连通分量),如果我们记录cnt
表示当前结点有多少个子结点不能够回到已经遍历过的结点,那么不难发现对于非根结点而言,如果当前的结点是一个割点,那么会产生cnt+1
(这cnt
个儿子所在的强连通分量和当前结点父亲所在的强连通分量)个强连通分量。对于根节点而言,不难发现如果他有cnt
个儿子结点,那么当cnt>=2
是根节点是一个割点,删除根结点会产生cnt
个强连通分量。
代码:POJ1523