旅行推销员最小生成树变种

时间:2015-03-26 20:48:47

标签: algorithm graph traveling-salesman minimum-spanning-tree prims-algorithm

我正在尝试解决以下图表练习:

在无向加权图中,有V个顶点和E个边。找到访问T(T <= V)顶点所需的最小权重,从标记为0的顶点开始。此外,如果两个访问顶点之间存在边,则其权重设置为0.

这不是典型的旅行推销员问题,因为附加条件是,如果您访问两个顶点,它们之间的边缘权重将减少为0.

如果T == V,使用Prim的最小生成树算法来解决问题,但由于您不一定要访问所有顶点,因此不会总是返回最小权重。

我想找到最小的生成树,然后切割不会阻碍我到达所有“目标”顶点的能力的每一条边,但这似乎过多而且可能不正确。

有什么想法吗?

编辑: 我给你举个例子。假设我们有一个4个顶点标记为0,1,2和3的图形。我们有以下边(从,到,权重): (0,1,1) (0,2,2) (1,3,4-) (2,3,1-) 最小生成树将包含边:(0,1,1),(0,2,2)和(2,3,1)。有了它,每个顶点都可以从0开始到达。但是,练习的目标是达到这些顶点的T个数。话虽这么说,我们可能,例如,只需要到达顶点2和3,使边(0,1,1)不必要,因此到达我们的目标顶点所需的总重量是2 + 1,而不是1 + 2 + 1。

1 个答案:

答案 0 :(得分:2)

看起来你的问题基本上是Steiner tree problem,已知它是NP难的。

实际上,你有一个无向加权图(V,E)。 给定T是V的子集,您希望找到覆盖T的所有顶点的总权重最小的树。

这是一个最明显的贪婪想法无法奏效的例子。 假设我们的图是非正则四面体ABCD的顶点和边,其中AB=BC=CA=5AD=BD=CD=3。 如果我们想要将A,B和C连接在一起,我们可以做的最好的事情是使用边ADBDCD来获得9的总权重。 如果我们决定不使用D,我们必须采用长度为5的两条边,而总重量为10。 但是,集合ABC的每个双顶点子集使用权重5ABBCCA)的一个直接边,并且没有边到顶点D在最佳解决方案中。

(哎哟!在三维欧几里德几何中,精确的长度是不可能的。但是,它仍然可以作为一个例子。)