【问题标题】:Directed Graph - How to count the number of vertices from which each other vertex in graph is reachable?有向图 - 如何计算图中每个其他顶点可到达的顶点数?
【发布时间】:2018-06-06 16:53:10
【问题描述】:

在有向图中,如何有效地计算图中其他顶点可达的顶点数?

【问题讨论】:

  • 您可以反转边缘并找到每个节点都可以到达的节点。
  • 你能说得具体一点吗?
  • 如果你想“高效”地做到这一点,你可能应该说出你的图表是如何存储的。你在使用节点和指针吗?还是邻接表?还是邻接矩阵?还是别的什么?
  • 邻接列表/邻接矩阵更有效。

标签: c++ algorithm graph-theory


【解决方案1】:

如果图中没有循环,则只能有一个这样的顶点,并且它的度数为零,并且没有其他顶点的度数为零。然后,您必须运行 DFS 以检查是否可以从它访问所有其他顶点。所以答案是 1 或 0,取决于 DFS 的结果。

如果存在环,则环中的所有顶点都具有此属性,或者没有一个顶点具有此属性。

如果您检测到一个循环,请将循环中的所有顶点替换为一个顶点,并为该顶点保留一个标签,说明它代表了多少个顶点。使用与上述相同的程序。即,检查度数并从新节点运行 DFS。答案将是零或标签。

可以使用 DFS 来检测循环。

图表中可能有多个循环。在这种情况下,您必须消除所有这些。您可以在一次 DFS 的线性传递中消除所有这些,但这很棘手。您还可以使用 btilly 在他的回答中建议的 Tarjan 算法。

【讨论】:

  • 您可能应该用顶点数和边数(V 和 E)而不是 n 来描述图算法的复杂性,以避免歧义。例如,DFS 检查是否存在循环是 O(V+E)。
  • 我的答案是独立找到的,但在道德上与这个答案相同,除了我进行了研究以确定第一步的线性算法。 :-)
  • @btilly 是的,我只是没有时间进行研究,只是输入了答案并关闭了我的计算机;)我认为您也可以使用修改后的 DFS 来实现目标。
  • @ciamej 我敢打赌,您可以使用修改后的 DFS 来实现目标。特别是因为这正是 Tarjan 的算法。 :-)(带有一些动态编程的 DFS。)
【解决方案2】:

使用Tarjan's strongly connected components algorithm 检测所有循环,然后构建一个图,其中每个强连接组件折叠到单个节点。

现在在这个新图中,查找没有入边的顶点就足够了。如果该顶点相互连接(可通过广度优先线性搜索验证),那么它所来自的强连接组件中的所有内容都在您的集合中,否则您的集合中没有顶点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多