【发布时间】:2016-02-09 22:10:39
【问题描述】:
给定一个权重为 w(e) 的加权无向图 G(v,e),找到边的集合,使得每对顶点 (u,v)∈G 都连接起来(简而言之,spanning tree)并且所选边的权重范围最小(或最小权重与最大权重之差最小)。
我尝试了贪婪的方法,其中根据权重对边进行排序,然后在排序后的数组中选择两个连续边之间权重差异最小的边 (g[index = current_left],g[index+1 = current_right]) ,随后我根据 (current_left,current_left-j) 或 (current_right,current_right+j) 之间的最小差异向左或向右移动,其中 j 递增,直到我们找到至少一个未访问的边缘顶点。
例如:
这里我们可以得到的最小范围是通过选择权重为 {2,3,5} 的边,范围是 3。
请指出一个建议算法失败的测试用例,并建议一种算法来寻找这种生成树。
编辑:
预期时间复杂度为 O(|E|log|E|) 其中 |E|是边数。
【问题讨论】:
-
如何选择第一条边?显然,在您的示例中,如果您从权重 7 的边缘开始,则无法找到最佳解决方案。
-
在对边进行排序时,我们得到 2,3,5,7,2 和 3 之间的差异为 1,这是通过选择两条边可能实现的最小差异。所以首先我选择 2,3 然后在我相应地选择之后。
-
那么,如果权重是1、2、100、102、104、108,你先选择1和2?我很确定您可以从中构建一个反例。
-
是的,没错,我明白了。那么如何解决呢?
-
一个明显的解决方案是枚举所有边的子集并找到一个生成树且权重最小的边。当然,时间复杂度是指数级的。那么运行时间有什么限制吗?
标签: algorithm graph range minimum spanning-tree