找到图表的最小权重

时间:2014-12-12 23:27:11

标签: python algorithm data-structures graph

我正在尝试使用Kruskal算法制作一个计算最小跨越重量的程序, 我已经按照增加的顺序使用它们对边缘进行了分类并将其放入2d列表中。 然后我写了一个方法来使用sortededge获得最小重量, 取样,sortededge = [['1', '2', '1'], ['5', '6', '1'], ['2', '4', '2'], ['3', '6', '2'], ['3', '5', '3'], ['4', '6', '3'], ['3', '4', '5'], ['1', '3', '6']] 方法是

vertexcheck = []
minimumdistance  = 0
def MSW:
    for i in range(len(sortededge)):
        if (sortededge[i][0] not in vertexcheck) or (sortededge[i][1] not in vertexcheck):
            if (sortededge[i][0] not in vertexcheck):
                vertexcheck.append(sortededge[i][0])


            if (sortededge[i][1] not in vertexcheck):
                vertexcheck.append(sortededge[i][1])
            minimumdistance += int(sortededge[i][2])

但它并不适用于所有图表,我欢迎任何帮助

1 个答案:

答案 0 :(得分:0)

您的算法实现错误。

举一个你算法失败的例子:

enter image description here

排序后边缘将如下所示:

边缘:

    1, 2, 1
    3, 4, 2
    2, 3, 5

在第一次迭代中,您将在顶点检查中放置1和2。更新了vertexcheck = [1,2]
在第二次迭代中,您将在顶点检查中放入3和4。更新了vertexcheck = [1,2,3,4]
但是在第3次迭代中,你不能添加2> 3边缘,因为你的顶点检查中都存在两个顶点。

这就是你的实现提供错误输出的原因:(

实际上,对于Kruskal的实现,您需要知道并使用名为Union-Find的数据结构算法,该算法会告诉您当前尝试连接的节点是否已连接:)

如果它们已经连接,那么跳过边缘,因为它们已经以较低的成本连接:)否则连接它们......

由于很多实现都可以使用python进行MST,我不打算给你一个:)

你可以在这里找到Pseudocode: Kruskal's_algorithm

一个示例实现: Kruskal's_implementation