使用 Kruskal 算法的最小生成树
Minimum Spanning Tree using Kruskal's Algorithm
我正在使用kruskal算法完成以下问题的确定最小生成树的分配:
我有城市,所有城市都必须连接。我可以通过在它们之间修路或建造机场来连接它们。当我在一个城市建造机场时,它就会与所有其他拥有机场的城市相连。
我的疑惑在下一个要求:
在不止一个最优解的情况下,我不得不选择机场较少的那个。我怎样才能以最有效的方式保证这一点?
在 kruskal 算法中,我们按权重的非递减顺序对边进行排序和 select。
假设我们使用数据结构(类似于元组)将边存储为 <source vertex,destination vertex, weight of edge between them>
。我们按权重的非递减顺序对边进行排序和选择。
现在如果有多个最佳解决方案,您更喜欢机场较少的那个。因此,如果目的地顶点(城市)有机场,请在数据结构中再添加一个字段(比如 boolean
类型)来存储。这应该类似于 <source vertex,destination vertex, weight of edge between them, has_destination_an_airport>
。如果目的地顶点(城市)有机场,has_destination_an_airport
是 true
,否则 false
。
现在当我们按权重的非递减顺序对边进行排序时,如果权重相同,则优先选择没有机场的边,即has_destination_an_airport
是 false
,如果可能的话。
总而言之,正确实施 comparator
对边缘进行排序会产生神奇效果。
就渐近时间和space复杂度而言,与Kruskal算法相同。唯一的开销是要记住目标顶点是否有机场的额外字段,这是微不足道的。
我正在使用kruskal算法完成以下问题的确定最小生成树的分配:
我有城市,所有城市都必须连接。我可以通过在它们之间修路或建造机场来连接它们。当我在一个城市建造机场时,它就会与所有其他拥有机场的城市相连。
我的疑惑在下一个要求:
在不止一个最优解的情况下,我不得不选择机场较少的那个。我怎样才能以最有效的方式保证这一点?
在 kruskal 算法中,我们按权重的非递减顺序对边进行排序和 select。
假设我们使用数据结构(类似于元组)将边存储为 <source vertex,destination vertex, weight of edge between them>
。我们按权重的非递减顺序对边进行排序和选择。
现在如果有多个最佳解决方案,您更喜欢机场较少的那个。因此,如果目的地顶点(城市)有机场,请在数据结构中再添加一个字段(比如 boolean
类型)来存储。这应该类似于 <source vertex,destination vertex, weight of edge between them, has_destination_an_airport>
。如果目的地顶点(城市)有机场,has_destination_an_airport
是 true
,否则 false
。
现在当我们按权重的非递减顺序对边进行排序时,如果权重相同,则优先选择没有机场的边,即has_destination_an_airport
是 false
,如果可能的话。
总而言之,正确实施 comparator
对边缘进行排序会产生神奇效果。
就渐近时间和space复杂度而言,与Kruskal算法相同。唯一的开销是要记住目标顶点是否有机场的额外字段,这是微不足道的。