Robert Tarjan,一个很牛逼的计算机科学家。
tarjan算法真的是一个神奇的算法,一个简单的dfs却可以解决连通性的问题以及求最近公共祖先。
1.求强连通分量
首先介绍一下什么是强连通分量。
强连通(Strongly Connected)是指一个有向图(Directed Graph)中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径。
强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。
当我们知道了强连通分量是什么了之后,我们来学习一下tarjan算法是如何求强连通分量的。
其实tarjan算法写起来很简单,就是一遍dfs,但是理解起来确实有点麻烦。
首先,
dfs就是我们通常的dfs,每个点需要标记有没有访问过,如果没有就往下dfs。
dfs出来的其实是一个搜索树。
每个节点我们需要保存两个信息
1.dfn[x],表示x是第几个访问的,就相当于有个cnt,每调用一层dfs,就使得cnt+1,然后赋值给当前访问的节点。
2.low[x],这个就不太好理解了ÿ