关于tarjan求强联通的一点小看法
2013-10-04 23:22
183 查看
在利用tarjan算法求强联通时,若(u,v)是回边,则low[u]=min(low[u],dfn[v]),对于这条,可以换成low[u]=min(low[u],low[v]),这里low数组记录的是对于某点,它所能回到的最早的结点。
因为对于v能回到的结点,既然u能到v,那u自然也能回到v,对于强联通,用dfn[u]==low[u]来判断出栈来说,没有任何关系。
但是,为什么要写dfn[v]呢?
例如,在求割点的时候,对于u,可能有两条支路分别为(u,v),(u,w),假设先走了(u,v),能回到u的前面,回溯到u的时候low[u]=min(low[u],low[v]),显然low[u]<dfn[u],然后此时又走(u,w)这条,假设在这条支路上有一点k,有(k,u)这条边,若是使用low[k]=min(low[k],low[u])的话,当回溯到w是,就有low[w]=low[u]<dfn[u],此时u点就不是割点,但实际上用low[k]=min(low[k],dfn[u])的话,就有low[w]==dfn[u],u是割点,而u确实是割点。
因为对于v能回到的结点,既然u能到v,那u自然也能回到v,对于强联通,用dfn[u]==low[u]来判断出栈来说,没有任何关系。
但是,为什么要写dfn[v]呢?
例如,在求割点的时候,对于u,可能有两条支路分别为(u,v),(u,w),假设先走了(u,v),能回到u的前面,回溯到u的时候low[u]=min(low[u],low[v]),显然low[u]<dfn[u],然后此时又走(u,w)这条,假设在这条支路上有一点k,有(k,u)这条边,若是使用low[k]=min(low[k],low[u])的话,当回溯到w是,就有low[w]=low[u]<dfn[u],此时u点就不是割点,但实际上用low[k]=min(low[k],dfn[u])的话,就有low[w]==dfn[u],u是割点,而u确实是割点。
相关文章推荐
- 关于界面用户体验ui的一点看法
- 关于在数据库中存储层次数据的一点看法与理解
- 关于javascript 以及 jQuery中获取文本值得一点看法
- 关于数据仓库 —lookup表的一点看法
- 关于Velocity的一点看法
- 关于距离一点简单的看法
- 关于js的call()和apply()两个函数的一点个人看法
- 关于MFC内部结构实用的一点看法
- 关于数据仓库 —lookup表的一点看法
- 关于网络安全的一点看法!
- 关于洛古p1019单次接龙的一点看法
- 关于积累的一点看法
- 关于对ac自动机的一点小小看法
- ARM中关于设置寄存器的一点看法
- 关于机器学习的一点看法
- 关于大学考试的一点看法
- 关于OA功能的一点看法
- 关于oa的俺也谈一点看法
- 关于软件可测试性的一点看法
- 关于using关键字的一点看法