我们如何在完全图中找到最大生成树
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) 条边,你就不需要总是 运行 所有的图。
给定一个 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) 条边,你就不需要总是 运行 所有的图。