算法核心·tarjan 割点和桥

概念

桥:去掉该边,无向图不再连通了。

割点:去掉该点,无向图不再连通了。(关键点,single point of failure)

连通:向图中,任一点可以到达任一点。(公路连接,各地都可以到达各地)

强连通:向图中,任一... (同上)

强连通分量:有向图中的一个部分,这个点集互相之间强连通

算法核心

disc[i]

定义

沿着dfs的时间流,visit某点的时间戳timestamp。

使用

最开始dfs visit该点时赋值。

low[i]

定义:

某点出发能够reach到的最早的时间戳。

使用

把分支的dfs走完后update low[i]。如果是已经visited过的点,

强连通分量

方法

如果low[i] == disc[i], 就是强连通分量的“起点”,一直把stack pop下一个low[] == disc[](下一个强连通分量)为止,都是同一个强连通分量。(pop过程中,所有low[i]如果小于disc[i], 就是强连通分量中的点。)

找割点

case 1

u不是root(有祖先),有孩子v, low[v] >= disc[u]

case 2

u是root,出发的dfs孩子(区别于树的孩子)个数 >= 2;

找桥

边【u到v】,low[v] > disc[u]

你可能感兴趣的:(图论)