在有向图中如何有效地计算图中每个其他顶点可以到达的顶点数?
答案 0 :(得分:2)
如果图中没有循环,则只能有一个这样的顶点并且它具有度为零,并且没有其他具有度为零的顶点。然后,您必须运行DFS以检查是否可以从其中访问所有其他顶点。所以答案是一个或零,取决于DFS的结果。
如果存在循环,则循环中的所有顶点都具有此属性,或者它们都没有。
如果检测到一个循环,则用一个顶点替换循环中的所有顶点,并为该顶点保留一个标签,表示它所代表的顶点数。使用与上面相同的步骤。即,检查in-degrees并从新节点运行DFS。答案是零或标签。
使用DFS可以完成检测周期。
图表中可能有几个周期。在这种情况下,你必须消除所有这些。您可以在DFS的一次线性传递中消除所有这些,但这很棘手。你也可以按照他的回答中的btilly建议使用Tarjan的算法。
答案 1 :(得分:1)
使用Tarjan's strongly connected components algorithm检测所有循环,然后构建一个图表,每个强连接组件都折叠到一个节点。
现在在这个新图中,找到一个没有边的顶点就足够了。如果该顶点连接到每个其他顶点(可通过宽度优先的线性搜索验证),那么它所来自的强连接组件中的所有内容都在您的集合中,否则您的集合中没有顶点。