【发布时间】:2015-03-26 20:48:47
【问题描述】:
我正在尝试解决以下图形练习:
在无向加权图中,有 V 个顶点和 E 个边。从标记为 0 的顶点开始,找到访问 T(T
这不是一个经典的旅行商问题,因为添加了一个条件,如果你访问两个顶点,它们之间的边的权重会减少到 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。
【问题讨论】:
-
如果您需要最小的权重总和,Prim 的算法也会为您提供正确的部分总和。
-
如果你需要最小化使用的最大边,你可以在那个最大值上进行二分搜索。对于给定的最大值,很容易(DFS 或 BFS)找到是否至少有 T 个顶点可以访问。
-
@Gassa 因此,如果我总共有 10 个顶点,并且我只需要访问顶点 1、4 和 7,例如,Prim 的算法会给我所需的最小总和吗?
-
在 T-1 次迭代后停止 Prim 不是答案。考虑一个图,其中 0 连接到 (1) 一条边长度为 10 的路径 (2) 一条长度为 100 的边,依次连接到一条边长度为 1 的路径。如果 T 足够大,我们希望使用 edge长度为 1,但 Prim 将无限期地探索 10s。
-
@Gassa 我添加了一个应该阐明任务的示例。
标签: algorithm graph traveling-salesman minimum-spanning-tree prims-algorithm