【问题标题】:Find a spanning tree with maximum number of edges with same weight找到具有相同权重的最大边数的生成树
【发布时间】:2017-10-17 14:14:12
【问题描述】:

这就是问题所在。

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

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

我已经坚持了很长一段时间了。我已经为图实现了Boruvka的MST搜索算法,现在不知道是不是应该在找到MST后进行任何操作,还是自己修改MST-search算法比较好。

欢迎提出任何建议!

【问题讨论】:

  • 那么条件的优先级如所列?也就是说,首先检查最大重量重复并打破与总树重量的关系?
  • @jdehesa 是的,就是这样。我编辑了这个问题,谢谢。

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


【解决方案1】:

这可以在O(m^2) 中天真地完成,而在O(mn) 中无需太多努力。似乎有可能做得更快,也许像O(m log^2(n)) 甚至O(m log(n)) 之类的,只需稍加工作即可。

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

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

这可以改进为O(mn),方法是首先使用原始权重找到MST,然后对于每个k,通过将权重k 的每个边的权重减小到@,将树修改为MST(k) 987654341@。更新 MST 以降低边权重是 O(n) 操作,因为您只需要在相应的 fundamental cycle 中找到最大权重边。

要使用这种方法比O(mn) 做得更好,您必须对原始 MST 进行预处理,以便可以更快地执行这些边缘权重减少。似乎heavy path decomposition 之类的东西在这里应该可以工作,但还有一些细节需要解决。

【讨论】:

  • 对于每个权重 k,可以使用 Kruskal 算法或 DFS 求权重 k 的非冗余边数。这是所涉及的顶点数减去仅使用 k 权重边的连接组件数。由于不同权重的边集是不相交的,因此一旦对边进行排序,对所有权重执行此操作需要 O(N) 时间。然后您可以使用 Kruskal's 计算最佳 k 的 MST(k),同样在 O(N)ish 时间内。总时间以 O(N log N) 中的边排序为主。
  • 确实可以找到 O(m) 中所有 k 的权重 k 的非冗余边的数量。但在最坏的情况下,这个数字对于每个 k 都是相同的,这意味着必须找到每个 MST(k)。如果非冗余边的数量是 O(1),这意味着必须找到 Omega(m) 不同的生成树。除非有某种图论的东西可以排除 k 的某些值,我不会立即看到。
  • 如果非冗余边的最大数量存在平局,则最高或最低的平局权重将是最好的。是哪一个取决于您如何阅读问题(如果捆绑重量计入总重量,则最低的最好)
  • 我不明白为什么这是真的。如果对于权重 j
  • 哎呀,这是真的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多