【问题标题】:Count number of MSTs in a graph计算图中 MST 的数量
【发布时间】:2013-11-20 16:40:19
【问题描述】:

这个问题我想了好几个小时,还是没有找到解决办法

问题是:

给定图表有多少个 MST (MST := 最小生成树)

图 G 是一个无向的连通图

保证没有顶点的度数超过 3 :)

更喜欢 C/C++ 方案(也能理解 like-code-formed Algorithm)

请以低顺序:)(运行时间)

更新

首先找到所有 MST :) O( |E| 对数 |E| )

其他更糟糕的:(

【问题讨论】:

  • 而 MST 是...(最小生成树?)
  • YES :) 最小生成树
  • 您能分享一下您的尝试或解决方法的想法吗?
  • 答案正确吗?不好:|如果我们限制顶点度数,有没有更好的方法

标签: c++ algorithm graph-theory graph-algorithm minimum-spanning-tree


【解决方案1】:

您可以尝试回溯。在每个“叶子”顶点之一的步骤中,决定使用多少“出”边。

function add_some_vertex_edges(leaves, edge):
  if |leaves| == |V|:
    num_of_MSTs += 1
    return
  v = leaves.pop()  # takes one vertex and removes it from leaves
  let v_edge be set of incident edges to v that are not already in edges and that don't make cycle if added to edges
  for each combination of edges from v_edge:
    add_edges(leaves + incident_vertices, edges + edge_combination)

add_some_vertex_edges({v}, {})

由于顶点度数

最坏情况下的运行时间是 O(2^n),但在实际情况下它可能很快。有最坏情况下 MST 数量的示例。我能想到的例子是两条平行的顶点线和它们之间的连接。

O---O---O---O---O---O---O---O---O---
 \ /     \ /     \ /     \ /     \ /
  X       X       X       X       X ...
 / \     / \     / \     / \     / \
O---O---O---O---O---O---O---O---O---

在此示例中,正好有 2^(n/2) 个 MST。要计算这个,取 2 个最左边的顶点。它们可以通过 4 种方式连接到图表的其余部分。

O---O   O   O   O   O   O---O
         \ /     \ /     \ /
          X       X       X
         / \     / \     / \
O---O , O   O , O---O , O   O

对于每组相互连接的 4 个顶点,有 4=2^2 种可能性可供选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多