我正在尝试解决以下图表练习:
在无向加权图中,有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。
答案 0 :(得分:2)
看起来你的问题基本上是Steiner tree problem,已知它是NP难的。
实际上,你有一个无向加权图(V,E)。 给定T是V的子集,您希望找到覆盖T的所有顶点的总权重最小的树。
这是一个最明显的贪婪想法无法奏效的例子。
假设我们的图是非正则四面体ABCD
的顶点和边,其中AB=BC=CA=5
和AD=BD=CD=3
。
如果我们想要将A,B和C连接在一起,我们可以做的最好的事情是使用边AD
,BD
和CD
来获得9
的总权重。
如果我们决定不使用D
,我们必须采用长度为5
的两条边,而总重量为10
。
但是,集合ABC
的每个双顶点子集使用权重5
(AB
,BC
或CA
)的一个直接边,并且没有边到顶点D
在最佳解决方案中。
(哎哟!在三维欧几里德几何中,精确的长度是不可能的。但是,它仍然可以作为一个例子。)