看的别人写的 很好,摘要几点的啦~~~:
一.概念:
1.强连通:如果在一个有向图上两个结点u,v他们相互之间至少存在一条通路,则他们是强连通的.
2.强连通图:如果有向图G任意两天都强连通,则G是强连通图.
3.强连通分量:有向非强连通图的极大强连通子图.
二.O(N+M)的Trajan, 特么的Trajan是个甜菜
1.Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。
定义:DFN(u)为节点u搜索的次序编号(时间戳),
Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号.那么Low(u)就是:
当DFN(u)=Low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。
代码:
证明待续哟
特么tarjan的证明真不会 艹个kosaraju充数吧:其实就是一个推论的重要性:拓扑排序的逆序顺序的dfs()在G的转置图上执行时总能保证它
通往的一个强连通分量已经被访问完毕.因为它的第一次dfs完成时间戳是当前及时状态下最大的了.