求强连通分量tarjan算法课程.doc

求强连通分量的tarjan算法 强连通分量有向图中的概念在一个图的子图中,任意两个点相互可达,也就是存在互通的路径,那么这个子图就是强连通分量。如果一个有向图的任意两个点相互可达,那么这个图就称为强连通图。如果u是某个强连通分量的根,那么:(1)u不存在路径可以返回到它的祖先(2)u的子树也不存在路径可以返回到u的祖先。强连通分量。在一个非强连通图中极大的强连通子图就是该图的强连通分量。比如图中子图{1,2,3,5}是一个强连通分量,子图{4}是一个强连通分量。 tarjan算法的基础是两个数组ow和fn,和一个栈。low数组是一个标记数组,记录该点所在的强连通子图所在搜索子树的根节点的fn值,fn数组记录搜索到该点的时间,也就是第几个搜索这个点的。根据以下几条规则,经过搜索遍历该图和对栈的操作,我们就可以得到该有向图的强连通分量。数组的初始化:当首次搜索到点p时,Dfn与Low数组的值都为到该点的时间。 堆栈:每搜索到一个点,将它压入栈顶。 当点p有与点p’相连时,如果此时(时间为dfn[p]时)p’不在栈中,p的low值为两点的low值中较小的一个。 当点p有与点p’相连时,如果此时(时间为dfn[p]时)p’在栈中,p的low值为p的low值和p’的dfn值中较小的一个。 每当搜索到一个点经过以上操作后(也就是子树已经全部遍历)的low值等于dfn值,则将它以及在它之上的元素

文档评论(0)

1亿VIP精品文档

相关文档