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

How can we find maximum spanning tree in complete graph

给定一个 n 个正整数数组,考虑到边 (i, j) = gcd(a[i], a[j]) 的权重,我们如何找到完整图中的最大生成树?

我知道一个复杂的解决方案 O(n^2),但是 n<=10^5,所以我需要更快的东西。

更新:

如评论中所述:

The question here is getting an algorithm that exploits the special structure of the graph.

根据其他约束,您可以使用 Kruskal 算法的变体。对于每个输入数字,将其因式分解并将其与其除数相关联,例如,given

[ 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]}.

按键降序迭代此映射。对于每个列表,合并那些不相交的集合。

您可以这样做:

  • 首先构建图表。
  • 将权重最小的 egdes 存储在 minHeap 上
  • 一条一条地去除图中的最小边(注意不要断开图)
  • 在每一步,检查图是否是树

最后一步比较棘手。一旦你知道一棵树有 (n-1) 条边,你就不需要总是 运行 所有的图。