tarjan算法引入
图论算法,反正很牛逼,可以用来解决很多的图论问题,主要是与连通性问题有关的。
在正式学习tarjan算法之前,我们需要了解一些基础概念
tarjan算法中的图论概念
时间戳 d f n [ x ] dfn[x] dfn[x]:结点 x x x的搜索的次序编号。( d f s dfs dfs序)
追溯值 l o w [ x ] low[x] low[x]:设 s u b t r e e ( x ) subtree(x) subtree(x)表示搜索树中以 x x x为根的子树。 l o w [ x ] low[x] low[x]定义为以下节点的时间戳的最小值:
1. s u b t r e e ( x ) subtree(x) subtree(x)中的节点。
2.通过1条不在搜索树上的边,能够到达 s u b t r e e ( x ) subtree(x) subtree(x)的节点
举个例子。 s u b t r e e ( 2 ) = 2 , 3 , 4 , 5 subtree(2)={2,3,4,5} subtree(2)=2,3,4,5。此外,节点1通过不在搜索树上的边 ( 1 , 5 ) (1,5) (1,5)能够到达 s u b t r e e ( 2 ) subtree(2) subtree(2)。所以 l o w [ 2 ] = 1 low[2]=1 low[2]=1。
根据定义,为了计算 l o w [ x ] low[x] low[x],应该先在遍历时令 d f n [ x ] = l o w [ x ] dfn[x]=low[x] dfn[x]=low[x],然后考虑从 x x x出发的每条边 ( x , y ) (x,y) (x,y):
若在搜索树上 x x x是 y y y的父节点,则令 l o w [ x ] = m i n ( l o w [ x ] , l o w [ y ] ) low[x]=min(low[x],low[y]) low[x]=min(low[x],low[y])。
若无向边 ( x , y ) (x,y) (x,y)不是搜索树上的边,则令 l o w [ x ] = m i n ( l o w [ x ] , d f n [ y ] ) low[x]=min(low[x],dfn[y]) low[x]=min(low[x],dfn[y])。
tarjan算法的分类(持续更新中)
割点
割点的定义
割点:如果去掉一个点以及与它连接的边,该点原来所在的图被分成两部分(不连通),则称该点为割点。
割点的判定法则
若x不是搜索树的根节点(dfs遍历的起点),则x是割点当且仅当搜索树上存在x的一个子节点y,满足:
d f n [ x ] ≤ l o w [ y ] dfn[x]\l