tarjan算法各种应用

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],这个就不太好理解了ÿ

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值