簡體   English   中英

計算圖中的MST數量

[英]Count number of MSTs in a graph

我好幾個小時都在想這個問題,但沒有找到解決辦法

問題是 :

給定圖具有多少個MST(MST:=最小生成樹)

圖G是無向的連通圖

保證頂點的度數不超過3 :)

更喜歡C / C ++解決方案(也可以理解類似代碼的算法)

並請以較低的順序:)(運行時間)

UPDATE

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

其他更糟糕的地方:(

您可以嘗試回溯。 在“葉”頂點之一的每一步中,確定要使用多少“出”邊。

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}, {})

由於頂點度<= 3,因此對於每個葉子,一個邊緣用於“輸入”,因此| v_edge | <= 2,並且由於該搜索樹很窄。

最壞的情況下運行時間是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種可能性可供選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM