查找具有相同权重的最大边数的生成树

时间:2017-10-17 14:14:12

标签: algorithm graph minimum-spanning-tree spanning-tree

这是问题所在。

给出加权无向连通图G.权重是不变的。任务是提出一种算法,该算法可以找到满足这两个条件的G生成树的总权重(按优先级排序):

  • 生成树必须具有具有相同权重的最大边数(实际重复的权重值无关紧要);
  • 应该最小化生成树的总重量。这意味着,例如,生成树T1的权重120最多有4个边具有相同的权重(以及每个权重的权重)这四个应该优于生成树T2,重量140最多有4个边具有相同的重量(并且这四个边的重量都是8)。

我已经坚持了很长一段时间了。我已经为图形实现了Boruvka的MST搜索算法,现在我不确定在找到MST之后是否应该执行任何操作,或者最好修改MST搜索算法本身。

欢迎任何建议!

1 个答案:

答案 0 :(得分:1)

这可以在O(m^2)中天真地完成,而且O(mn)不需要太多努力。似乎可以更快地完成它,可能像O(m log^2(n))甚至O(m log(n))那样只需要一点工作。

基本理念是这样的。对于任何权重k,让MST(k)为生成树,其中包含权重k的最大可能边数,否则具有最小总权重。可能有多个这样的树,但它们都具有相同的总重量,因此您选择哪一个并不重要。通过使用任何MST算法并将权重MST(k)的所有边缘视为权重k,可以找到-Infinity

对于某些MST(k),此问题的解决方案为k。因此,天真的解决方案是生成所有MST(k)并选择具有最大数量的相同边缘权重然后最小总重量的那个O(m^2)。使用Kruskal算法,您可以在O(mn)中执行此操作,因为您只需对边进行一次排序。

首先使用原始权重找到MST,然后对每个k,通过减少每个边缘的权重,将树修改为MST(k),可以将其改进为k。权重-InfinityO(n)。为减少边缘权重更新MST是O(mn)操作,因为您只需要在相应的fundamental cycle中找到最大权重边缘。

要使用此方法比g = sns.pairplot(iris, hue="species", palette="Set2", diag_kind="kde", size=2.5) 做得更好,您必须以这样的方式预处理原始MST,以便可以更快地执行这些边缘权重减少。似乎像heavy path decomposition这样的东西应该在这里起作用,但是有一些细节需要解决。