要使所有节点都可以从根到达,需要构建的新边的最小数量是多少?
给出有向图和根索引。
我尝试查找所有组件(如果图形是无向的),然后查找没有父节点的节点数,我称该数字为sol。我遍历每个组件并询问孤立节点的数量。如果没有,并且不包含根,则将1加到sol中,因为我应该将该组件连接到根。当组件是循环时,这是可能的。特殊情况是包含根的组件。如果没有父节点为0的节点,则sol保持不变,如果有父节点,则sol为sol + number_of_those_nodes(如果根具有父节点)或sol + number_of_those_nodes-1(否则)
能帮我解决这个问题并创建有效的伪代码吗?
答案 0 :(得分:1)
想法1 :找到图(强连接组件的图)的condensation。现在该图是非循环的,但是答案是相同的:在强连接的组件内部添加边线没有任何意义,并且连接的强连接的组件到底有多精确也没有关系。现在,我们的问题是相同的,但是在非循环图上(根成为其强连接的组件)。
想法2 :请注意,对于除根以外的所有源顶点(入站度为零的顶点),我们应至少添加一条边(入站边)。这为我们提供了一个下限。
想法3 :如果该下限为零,则由于图形已经很好,因此可以实现该上限。
通过矛盾证明:看一下从根开始未到达的任意顶点X
。它至少有一个入站边,否则我们的下限将不为零。假设它具有来自任意顶点Y
的入站边。如果达到了Y
,那么也将达到X
,因此Y
也没有达到。对Y
重复相同的参数,现在我们有了无限的顶点路径。但是它不能具有相同的顶点两次,否则在我们的图形中会有一个循环,但是它已经压缩了。另一方面,顶点数量有限。 Q.E.D。
想法4 :如果下界大于零,我们可以从根到每个源顶点绘制边,将下界降低到零并应用概念3,从而获得确切的下界