使用Kruskal算法的最小生成树

时间:2017-04-30 15:59:56

标签: algorithm minimum-spanning-tree kruskals-algorithm

我使用kruskal算法来完成确定以下问题的最小生成树的分配:

我有城市,都必须连接。我可以通过在它们之间修建道路或建造机场来连接它们。当我在一个城市建造机场时,它会与所有其他拥有机场的城市相连。

我怀疑是下一个要求:

在多个最佳解决方案的情况下,我必须选择机场较少的解决方案。我怎样才能以最有效的方式保证这一点?

1 个答案:

答案 0 :(得分:1)

在kruskal算法中,我们按照权重的非递减顺序对边缘进行排序和选择。

我们假设我们使用数据结构(类似于元组)将边缘存储为<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_airporttrue,否则为false

现在,当我们按照权重的非递减顺序对边缘进行排序时,如果权重相同,则优先选择没有机场的边缘,即。如果可能,has_destination_an_airportfalse

总而言之,正确实施comparator以对边缘进行排序将会产生魔力

就渐近时间和空间复杂度而言,它与Kruskal算法的相同。如果目的地顶点有一个机场,那么只有额外的字段需要记住,这很简单。