Targan算法求割边、割点

Posted by Xsp on February 24, 2018

https://hihocoder.com/problemset/problem/1183

割边:在连通图中,删除了连通图的某条边后,图不再连通。这样的边被称为割边,也叫做桥。
割点:在连通图中,删除了连通图的某个点以及与这个点相连的边后,图不再连通。这样的点被称为割点。
DFS搜索树:用DFS对图进行遍历时,按照遍历次序的不同,我们可以得到一棵DFS搜索树。

以hihocoder 1183为例,得到的搜索树为:

树边:在搜索树中的蓝色线所示,可理解为在DFS过程中访问未访问节点时所经过的边,也称为父子边。
回边:在搜索树中的橙色线所示,可理解为在DFS过程中遇到已访问节点时所经过的边,也称为返祖边、后向边、余边。

两类节点可以成为割点:

  • 对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点;
  • 对非叶子节点u(非根节点),若其中的某棵子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与该棵子树的节点不再连通;则节点u为割点。
  • 叶子节点不是割点,因为删除叶子节点后,剩下的仍然是个连通图。

用深索数 dfn[u]记录节点u在DFS过程中被遍历到的次序号,最低深索数 low[u]记录节点u或u的子树通过非父子边追溯到最早的祖先节点(即DFS次序号最小),那么low[u]的计算过程如下:

  • , (u,v) 为树边
  • , (u,v) 为余边

为什么深搜?深搜来判断连通性。比如1183这题,最暴力的解法,一次删除一条边或一个节点,然后dfs判断下是否连通,当然这样会超时,所以引出了上述的targan算法。