如何在有向图中找到最小顶点集,以便可以到达所有其他顶点

时间:2010-12-20 18:54:09

标签: algorithm graph-theory

给定有向图,我需要找到可以到达所有其他顶点的最小顶点集。

因此函数的结果应该是最小数量的顶点,通过跟随有向边可以从中到达所有其他顶点。

可能的最大结果是如果没有边缘,那么将返回所有节点。

如果图中有循环,则对于每个循环,选择一个节点。哪一个无关紧要,但如果算法再次运行则应该是一致的。

我不确定现有的算法是什么?如果是这样,它有一个名字?我试过做我的研究,最接近的事情似乎是找到mother vertex 如果是那个算法,可以详细说明实际算法,因为该链接中给出的答案有点模糊。

鉴于我必须在javascript中实现它,首选项将是.js库或javascript示例代码。

2 个答案:

答案 0 :(得分:4)

根据我的理解,这只是在图表中找到强关联的组件。 Kosaraju's algorithm是实现此目标的最佳方法之一。它使用两个深度优先搜索,而不是一些仅使用一个的后来算法,但我最喜欢它的简单概念。

编辑:为了扩展它,找到最小的顶点集,如本帖的评论中所建议的那样: 1.找到图的强连通分量 - 将每个分量减少到一个顶点。 2.剩下的图是DAG(或者如果存在断开的组件则为DAG集),其根形成所需的顶点集。

答案 1 :(得分:0)

[编辑#2:正如Jason Orendorff在评论中提到的那样,找到反馈顶点集是过度的,并且通常会产生大于必要的顶点集。 kyun's answer是(或将来,当他/她在评论中添加重要信息时)正确的方式。]

[编辑:我走错了两步......现在我们应该保证最低限度。]

  1. 使用度为零的Z调用所有顶点。任何其他顶点都无法到达Z中的顶点,因此必须包含在最终集中。
  2. 使用深度优先(或广度优先)遍历,跟踪Z中每个顶点可到达的所有顶点并删除它们 - 这些是Z已“覆盖”的顶点
  3. 图表现在完全由定向循环组成。找到feedback vertex set F,它会为您提供尽可能小的顶点集,其删除会破坏图中的每个周期。不幸的是,正如Wikipedia链接所示,这个问题对于有向图来说是NP难的。
  4. 您正在寻找的顶点集是Z+F