证明在给定边缘分组约束下生成2条最短路径的NP完全性?

时间:2015-06-22 22:17:09

标签: np-complete np

我一直在努力解决以下问题:NP-Complete或NP-Hard。

问题如下:

给出图G(V,E)并要求生成从起始节点S到节点T的两条路线。边E被分成K个不相交集。让我们将两条路线称为R1和R2。在同一组中不存在边缘E1和E2,使得E1在路径R1中并且E2在R2中(更简单地说,每个集合必须由不多于一个路由使用)。此外,R1和R2之间不能共享节点。我们正在寻找R1和R2的最短组合路径长度(最小化(len(R1)+ len(R2)))。

我尝试将Subset Sum和Independent Set减少到此但没有成功。

1 个答案:

答案 0 :(得分:0)

首先,感谢发布一个非常有趣的问题。通过这项工作非常有趣!

我提出的减少是从3SAT到你的问题。直觉上,减少的工作原理如下:我们构建一个由两个并行的级联节点组成的图形(让我们称它们为左右分支)。左分支边对应于公式中的变量,右分支对应于公式中的子句。我们将构建图形,使得两个路径对应于为满足所有子句的公式选择变量赋值。

强制变量取值的左分支构建如下。对于每个变量x,构建一个如下所示的小工具:

              *
  true -->   / \  <-- false
            *   *
             \ /
              *

从顶部节点开始,我们将“左”表示“x为真”而“右”表示“x为假”。我们将为每个变量构建此小工具的一个副本,并从上到下链接它们。因此,从链顶部到底部的路径对应于为命题公式选择变量赋值。

右侧分支的构建方式相似。假设我们有一个条款x&amp; lor; y&amp; lor; ž。然后我们构建这个小工具:

              *
             /|\
            * * *
             \|/
              *

这里,左分支对应于“x为真”,中间分支对应于“y为真”,右分支对应于“z为真”。我们的想法是,我们需要至少有一个真正的文字每个子句,我们将通过选择哪条路径来选择哪个文字。

现在,我们构建约束集。对于每个变量x,我们要确保如果在左侧分支中我们说x为真,则我们不遵循右侧分支中的边缘,其中x应该是假的。因此,我们将创建一个约束集,其中包含来自左分支的边缘“x is true”以及来自右分支的“x is false”的所有副本。我们将类似地创建第二个约束集,其中包含来自左分支的边缘“x is false”以及来自右分支的标记为“x为真”的所有边。这些约束集共同确保如果我们通过左分支和右分支获取路径,我们为每个变量选择一个值(通过左分支的路径)并且每个子句选择至少一个真正的文字(通过右分支)。

要完成所有操作,我们将创建一个新的起始节点S和一个新的终端节点T,将S链接到左分支中的第一个节点和右分支中的第一个节点,并链接左边的最后一个节点和右边的分支到T.现在,当且仅当存在两个从S到T的节点不相交路径时,才能满足所有约束。做一些快速数学运算表明,如果公式有n个变量和m个子句,那么通过左分支的路径长度将为2n + 2,通过右分支的路径长度将为2m + 2,因此公式当且仅当存在从S到T的一对节点不相交的路径时才能满足,如果公式不可满足,则注意到根本没有合法的路径。

希望这有帮助!