遍历整个图的最小节点数

时间:2018-11-14 11:33:40

标签: c++ data-structures graph-theory

注意:问题已完全更改。

在下面的图中,如果我们选择节点0和2,则可以遍历整个图。我正在寻找一种有效的算法来返回这两个节点。请注意,这既不是顶点覆盖问题也不是控制集问题,因为我们不需要选择节点3。我们说,如果选择节点0,则可以从那里转到节点1,如果选择节点2,则可以。我们可以先到节点3,再到节点4。

如果我在其上运行 SCC算法,它将找到所有顶点作为不同的SCC,并且我无法从那里到任何地方:

C:\>project2 ../../input.txt o.txt
Following are strongly connected components in given graph (Each line is a different SCC)
2
4
3
0
1

enter image description here

1 个答案:

答案 0 :(得分:1)

如果图中没有循环,即该图是有向无环图(DAG),那么我们只需要计算每个节点的度数即可。度数为0的节点集是必需的集。

如果您不熟悉度数,如果有边 a-> b ,则 b 的度数会增加1。

之所以可行,是因为如果存在边 a-> b ,即 b 具有向内度,则意味着存在一个节点 a 哪个 b 可以访问。因此,最好将节点 a 包含在集合中,而不是 b 。除非我们从节点本身开始,否则度数为0的节点没有其他访问方式。因此它将包含在集合中。

如果图形中存在循环,我们将搜索“强连接的组件(SCC)”。然后,我们以SCC作为一个节点,构建了一个新图,并从初始图中添加了连接两个不同SCC的边。新图将是DAG。然后,我们可以应用上述过程找到所需的节点集。