[英]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.