【问题标题】:Creating a graph and finding strongly connected components in a single pass (not just Tarjan!)一次创建一个图并找到强连接的组件(不仅仅是 Tarjan!)
【发布时间】:2014-08-03 19:08:06
【问题描述】:

我有一个特殊的问题,即有向图的每个顶点恰好有四个向外指向的路径(可以指向同一个顶点)。

一开始,我只有起始顶点,我使用 DFS 发现/枚举所有顶点和边。

然后我可以使用 Tarjan 算法之类的东西将图形分解为强连接组件。

我的问题是,有没有比发现图形然后应用算法更有效的方法。例如,有没有一种方法可以将这两个部分结合起来以提高效率?

【问题讨论】:

    标签: algorithm graph directed-graph tarjans-algorithm


    【解决方案1】:

    为了避免一开始就“发现”图,Tarjan 算法需要的关键属性是,在其执行的任何时候,它都应该只依赖于它迄今为止探索过的子图,并且应该只能通过枚举一些已经访问过的顶点的邻居来扩展这个探索过的区域。 (例如,如果一开始就需要知道图中的节点或边的总数,那么你就会沉没。)从Wikipedia page 看来,该算法确实具有这个属性,所以没有,您不需要在开始时执行单独的发现阶段 - 您可以在 for each (v, w) in E do 行“懒惰地”发现每个顶点(就像您当前在发现 DFS 中所做的那样枚举 v 的所有邻居)和 @987654323 @(只需选择 v 为您在上一步中已发现为 w 的任何顶点,但您尚未通过调用 strongconnect(v) 访问该顶点)。

    也就是说,由于您的初始 DFS 发现阶段无论如何只需要线性时间,如果消除它会大大加快速度,我会感到惊讶。但是,如果您的图表太大以至于无法放入缓存中,则总时间可能会减半。

    【讨论】:

    • 谢谢。我还想知道是否有比 Tarjan 更好的算法可以利用与发现阶段同时运行的漏洞,即运行速度也与 DFS 一样快。
    • @CharlesNobbert:不客气。顺便说一句,点赞一个你喜欢的答案并没有什么坏处,提示 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多