有向图的所有顶点都存在路径吗?

时间:2012-04-17 06:56:52

标签: algorithm directed-graph

给定G,一个有向图,是否有一条通过G中所有顶点的路径(不一定是一条简单的路径)?

我首先需要检查非循环图和强连通图中发生的情况,然后使用强连通组件的图表来查找一般图的解决方案。

到目前为止,我已经发现,对于强连通图,总有一条路径。对于非循环图,如果有多个源,则路径将永远不存在。此外,如果存在D out大于1的顶点,则路径将永远不存在。

问题是,我不确定最后一个是否正确,如果错了,我的算法是错误的。

1 个答案:

答案 0 :(得分:1)

最后一个假设不正确,例如,查看图G = (V,E),其中E = {(v_i,v_j) | i < j }图表显然是DAG。因此,找到最大强连通分量不会改变图形。此外 - 图表有哈密尔顿路径,但d_out(v_1) > 1 [假设为|V| > 3]。

然而 - 你走在正确的轨道上。

高级伪代码中的算法:

  1. 在图表中找到最大强连接组件 - 结果图是DAG。
  2. 在结果图 1 上使用拓扑排序。
  3. 检查有序排序是否创建了哈密尔顿路径
  4. 如果是 - 返回true,否则返回false
  5. <强>要求:

      

    当且仅当DAG表示时,存在具有所有顶点的路径   图的MSCC有哈密顿路径

    声明证明:
    &LT; - 如果有一条哈密顿路径 - 那么这条路径是微不足道的,对于每个MSCC - 路径遍历所有顶点,然后到达表示我们在哈密尔顿路径中选择的边缘的外边缘。 MSCC图。
    - &GT;
    如果存在这样的路径,请将其设为v0->v1->...vm
    让我们用V_i表示v_i所在的最大强连通分量v0->v1->...->vm
    现在,对于原始图V_0->V_1->...->V_m中的路径,MSCC图中还有一个路径 2 V_i
    请注意,如果V_i->V_k->...->V_i在上述路径中出现两次[或更多],则两次出现彼此相邻,否则找到的MSCC不是最大值,因为如果V_i是可行的路径 - 然后V_i和V_k不是最大值,因为你可以将它们组合成一个更大的SCC。
    现在,每个V_i将所有出现的事件合并为一个,你就会找到一条路径 - 每个v_i最多出现一次[我们只是为什么显示],而且只有一个[因为每个V_i->V_i都在原始路径上,我们没有完全删除MSCC - 只是将它们折叠了]。
    因此 - 生成的路径是MSCC图中的哈密顿路径。

    建议的算法的正确性证明:
    因为我们在MSCC图中显示了哈密顿路径,当且仅当原始图中存在请求的路径时 - 然后:
    - &GT;
    算法返回true - &gt;该算法在DAG中找到哈密顿路径 - &gt; Dag中有一条汉密尔顿路径[脚注1] - &gt;原始图表中有一条路径。
    &LT; -
    算法返回false - &gt;该算法未在DAG中找到哈密顿量的拍子 - &gt; DAG中没有哈密顿路径[脚注1] - &gt;原始路径中没有要求的路径。

    <强> Q.E.D。


    1:在DAG​​中,如果存在哈密顿路径,则存在唯一的拓扑排序,如果存在哈密顿路径,则它是拓扑排序中的顶点的顺序。因此,在DAG中 - 发现哈密顿路径很容易。
    2:实际上,它有点修改,{{1}}并不是MSCC上的一个优势,但是现在让我们把它表示为一个。