繁体   English   中英

找到图的最小权重

[英]finding the minimum weight of a graph

我正在尝试制作一个使用Kruskal算法计算最小跨度权重的程序,我已使用其weghts对边缘进行了升序排序,并将其放入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, 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有许多实现方式,我不会麻烦您一个:)

您可以在这里找到伪代码: Kruskal's_algorithm

以及一个示例实现: Kruskal's_implementation

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM