当前位置: 首页 > 知识库问答 >
问题:

寻找具有相同权值的最大边数的生成树

袁志专
2023-03-14

问题来了。

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

  • 生成树必须具有相同权重的最大边数(实际重复权重值与此无关);
  • 总生成树权重应最小化。这意味着,例如,权重为120的生成树T1最多有4条相同权重的边(这四条边中的每一条的权重都是15)应该优于权重为140的生成树T2,这四条边最多有4条相同权重的边(这四条边中的每一条的权重都是8)。

我已经被困在这个问题上好一阵子了。我已经为图实现了Boruvka的MST搜索算法,现在我不确定是否应该在找到MST后执行任何操作,或者最好修改MST-search算法本身。

共有1个答案

裴华荣
2023-03-14

这可以在O(m^2)中简单地完成,而在O(mn)中无需太多努力。似乎可以更快地完成这一任务,例如O(m log^2(n))O(m log(n))只需做一点工作。

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

对于某些k,此问题的解决方案是MST(k)。因此,简单的解决方案是生成所有MST(k),并选择相同边权值最大的边权值,然后选择总权值最小的边权值。使用Kruskal的算法,您可以在O(m^2)中完成此操作,因为您只需对边排序一次。

这可以改进为O(mn),方法是首先使用原始权重查找MST,然后对于每个k,通过将权重k的每个边的权重减少为-infinity,将树修改为MST(k)。更新MST以减少边缘权重是一个O(n)操作,因为您只需要在相应的基本周期中找到最大权重边缘。

要使用这种方法比O(mn)做得更好,您必须对原始MST进行预处理,以便能够更快地执行这些边权重降低。看起来像一个沉重的路径分解应该在这里工作,但有一些细节需要解决。

 类似资料:
  • 如果给定图中所有边的权重相同,Dijkstra的算法还能找到两个顶点之间的最短路径吗?谢谢!

  • 设T=(V,E)是一棵顶点和边的树,代价已知。我们想构造一个最小权完备图G=(V,E'),它的唯一最小生成树是T。 示例:考虑下面的树T,红色边具有给定的代价。将添加虚线边以从这棵树构造一个完整的图。 作为其唯一MST而跨越T的最小权完备图G如下所示: 2)对MST的所有其他边,权重,按权重递减的顺序重复。进行只包括而不包括其他MST边的切割。此切割的任何未知非MST边的权重应为。 问题: 1)上

  • 我有一个熊猫数据框,有两列,一列是温度,另一列是时间。 我想做第三和第四列,叫做最小和最大。这些列中的每一个都将填充nan's,除非有一个局部min或max,那么它将具有该极值的值。 这里是一个数据的样本,本质上我试图识别图中所有的峰值和低点。 有没有内置的熊猫工具可以做到这一点?

  • 我正试图从一个加权无向图中找到跨越三的次优最小值。我知道如何使用Kruskal算法计算MST,我想用这种方法找到第二好的最小算法: 步骤: > 对所有图形边进行排序。 使用Kruskal计算MST 从不在第一个MST中的图中获取最小权重边,并将其添加到MST中(现在MST有一个循环) 在新形成的循环中移除最大重量边 这应该是第二好的MST吧? 顺便说一句,我知道这里有一个主题,指出了一个算法,它在

  • 本文向大家介绍在C ++中生成相同总和的对的最大数量,包括了在C ++中生成相同总和的对的最大数量的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目的是在数组中找到最大对数,相加后将产生相同的总和。我们必须找到此类对的最大数量。 输入值 输出结果 说明-数字对的总和- 输入值 输出结果 说明-数字对的总和- 以下程序中使用的方法如下 整数数组Arr []用于存储整数。 整数“大小”存

  • 所以,我想插入一个数组,然后按最大到最小的顺序返回3个数,每两个数之间的差值相同。 下面的代码是我的尝试。我为循环做了3个