问题描述
令 ?=(?,?)
是一个无向无权图,顶点为 ?
。令 ?_1,?_2,...,?_?
是 ?=?−1
不同的 ? 生成树。找到找到生成树的多项式时间算法
? 中的 ?=(?,?_?)
包含来自每个生成树 ?_?
的至少一条边。
我真的很感激这方面的任何帮助!
解决方法
生成树具有 matroid 结构。因此,下面的贪心算法有效:从一个空的森林开始,对于每个输入生成树,通过任何一个不创建循环的树边扩展森林。正确性或多或少直接来自于增强特性和独立性的定义。
,这是一个基本的解决方案。
//if the graph is given in input:
// If any bridge exists in the graph:
// return any spanning tree from the list of input spanning trees
while the size of result set is less than |V|-1:
for every tree in the list of spanning trees:
for every edge in the tree:
if edge is not a part of result set:
if adding this edge to the result set doesn't form a cycle:
add the edge to result set
break
if size of result set is V-1:
break
- 生成树列表的大小
- 生成树列表的大小> |V|-1:需要证明“上述算法返回的结果集至少包含生成树列表中所有剩余树的一条边”。我会在闲暇时尝试这个证明。
如果对于给定的图 |E|
一个有趣的例子是 |E| >= 2*(|V|-1)。如下图所示,对于一些生成树L的输入列表,假设绿色边的集合是上述算法返回的结果集。可以在不使用任何绿色边的情况下形成蓝色边的生成树。
刚刚发布了这个答案,以便它可以作为试图回答这个问题的人们的一些基本基础工作。否则,可能被视为蛮力解决方案。