我们如何在完整图中找到最大生成树

时间:2016-12-10 16:18:46

标签: algorithm graph graph-algorithm graph-theory number-theory

给定一组class Riddle_Room(Room): def activate(self): global current_room print "Riddle room query" current_room = "riddle_room" self.ip = raw_input("> ") self.count = 3 print self.ip while self.count > 0: if "back" in self.ip: rm.back() elif "yes" in self.ip: print "Riddle" self.answer = raw_input("> ") if self.answer == "answer": print "You got that right!" rm.enter() else: print "Try again!" self.count -= 1 print "No choices left." quit() else: print "Invalid command." 正整数,我们怎样才能在完整图中找到最大生成树,考虑边n的权重?

我知道一个复杂度(i, j) = gcd(a[i], a[j])的解决方案,但O(n^2),所以我需要更快的东西。

UPD:

如评论中所述:

  

这里的问题是获得一个利用特殊算法的算法   图的结构。

2 个答案:

答案 0 :(得分:2)

根据其他约束,您可以使用Kruskal算法的变体。对于每个输入数,考虑它并将其与其除数相关联,例如,给定

[ 1,  2,  3,  4,  5,  8,  9, 10, 12]

我们制作地图

{ 1: [ 1,  2,  3,  4,  5,  8,  9, 10, 12],
  2: [ 2,  4,  8, 10, 12],
  3: [ 3,  9, 12],
  4: [ 4,  8, 12],
  5: [ 5, 10],
  6: [12],
  8: [ 8],
  9: [ 9],
 10: [10],
 12: [12]}.

按降序顺序迭代此地图。对于每个列表,将这些不相交的集合联合起来。

答案 1 :(得分:0)

您可以执行以下操作:

  • 首先构建图表。
  • 将最小重量的egdes存放在minHeap
  • 逐个删除图表中的最小边缘(注意不要断开图表)
  • 在每个步骤中,检查图表是否为树

最后一步非常棘手。一旦你知道树有(n-1)个边缘,你就不会总是需要运行所有的图形。