最短路径和最小生成树的组合

时间:2013-12-22 11:53:54

标签: c++ algorithm shortest-path

我试图获得无向加权图的最小生成树。但是,我需要找到一对或多对节点之间的最短路径。之后,我必须找到图的最小生成树。我已经找到了必要节点之间的最短路径,但我不知道如何找到包括这些最短路径的最小生成树。让我举个例子。

 G
 |2 
 H      A
 |1     |6      
 F      ------B
 |1           | 7
 E -----D-----C
    2      8    

A和E之间也有2个重量的边缘,但我无法显示它。

现在,首先我需要找到A和E之间的最短路径(由于我的应用,我必须这样做),这是A-E-D-C,然后用最小跨度连接所有图形。有没有人帮我提一些线索?抱歉英语不好而不是我的母语

1 个答案:

答案 0 :(得分:3)

只是一个MST

如果你只是想要MST,那只需要运行Kruskal's algorithm(见下文)或Prim's algorithm

  
      
  1. 使用单个顶点初始化树,从图中任意选择。
  2.   
  3. 通过一条边生长树:在将树连接到树中尚未到达的顶点的边缘中,找到最小权重边缘,并将其传递给树。
  4.   
  5. 重复步骤2(直到所有顶点都在树中)。
  6.   

这不涉及获取顶点之间的最短路径。实际上,它不一定包括一些最短的路径。考虑:

  A
1 |\
  B \
1 |  \ 2
  C   \
1 |    \
  D-----E
     1

A和E之间的最短路径是2(直接从A到E),但是MST(A-B-C-D-E)不包括该边缘。

'MST'包括一些最短路径

如果你想找到包含一些最短路径的MST,这是一个最有趣的问题。

这可以通过运行Kruskal算法进行微小变化来解决。

派生自Wikipedia

  • 创建一个森林F(一组树),其中图中的每个顶点都是一个单独的树,不包括最短路径的顶点。
  • 将最短路径作为单个树添加到林中
  • 创建一个集合S,其中包含图表中除最短路径边缘的所有边缘
  • 虽然S是非空的,而F还没有跨越
    • 从S
    • 移除重量最小的边缘
    • 如果该边连接两个不同的树,则将其添加到林中,将两棵树合并为一棵树
    • 否则丢弃该边缘