给定有向图 G = ( V , E ) G=(V,E) G=(V,E),若存在 r ∈ V r \in V r∈V,满足从 r r r出发能够到达 V V V中所有的点,则称 G G G是一个“流图”,记为 ( G , r ) (G,r) (G,r),其中 r r r称为流图的源点。
与无向图的深度有限遍历类似,我们也可以定义流图中的搜索树和时间戳的概念。
流图中的每条有向边 ( x , y ) (x,y) (x,y)必然是一下四种之一:
1.树枝边,指搜索树中的边,即 x x x是 y y y的父节点
2.前向边,指搜索树中 x x x是 y y y的祖先节点。
3.后向边,指搜索树中 y y y是 x x x的祖先节点。
4.横叉边,指除了以上三种情况之外的边,它一定满足 d f n [ y ] < d f n [ x ] dfn[y]<dfn[x] dfn[y]<dfn[x]。
如下图所示:
有向图的强连通分量
给定一张有向图,若对于图中任意两个节点 x , y x,y x,y,既存在从 x x x到 y y y的路径,也存在从 y y y到 x x x的路径,则称该有向图是“强连通图”。
有向图的极大连通子图被称为“强连通分量”,简记为 “ S C C ” “SCC” “SCC”。此处的极大与双连通分量的极大的意思是一样的。
一个“环”一定是强连通图。如果既存在从 x x x到 y y y的路径,也存在从 y y y到 x x x的路径,那么 x , y x,y x,y显然在一个环中。因此, T a r j a n Tarjan Tarjan算法的基本思路就是对于每个点,尽量找到与它一起能构成环的所有节点。
其实前向边 ( x , y ) (x,y) (x,y)没有什么用处,因为搜索树上本来就存在从 x x x到 y y y