7

可以使用 Prim 算法或 Kruskal 算法来找到一组顶点/节点和边/链接的最小生成树/图。不过,我想要的是一种算法,可以找到这个集合的最小跨度图,但结果图只需要包含任意选择的节点,而不是所有节点。如果结果图包含的节点多于所需的节点,那也没关系。

这样的算法存在吗?在修改图形以仅包含所需节点之后,也许可以只使用 Prim(或 Kruskal)算法?但是,我不确定如何在保持连接性的同时修改图表。

例如,假设我们有一个菱形的起始图(括号中的链接成本):

    A
(2)/ \(1)
  B   C
(2)\ /(5)
    D

现在,我们任意决定只需要节点 A 和 D。如果我们从 A 开始,我们仍然希望它走左边的路径,因为 ((2 + 2) < (1 + 5))。

假设我们稍微修改一下图表:

    A
(2)/ \(1) (2)
  B   C ------E
(2)\ /(5)
    D

如果我们决定只需要节点 A、D 和 E,我们就会意识到成本最小的路径不一定是链接最少的路径。取 A--B--D 和 A--C--E 花费 7,但 A--C--D 和 C--E 花费 8。

4

1 回答 1

7

您要查找的是离散的Steiner 树。当图中并非所有顶点都是强制性的,但允许树在可选顶点处分裂时,问题是 NP-hard。

维基百科说(上面链接)这个问题:据信,通常不能在多项式时间内实现任意好的近似比。有一种多项式时间算法可以找到最小 Steiner 树的因子 1.39 近似值。

于 2012-10-30T20:04:00.173 回答