概念
桥:去掉该边,无向图不再连通了。
割点:去掉该点,无向图不再连通了。(关键点,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]