【问题标题】:Wrong output in Implementing Kruskal Algorithm in Python在 Python 中实现 Kruskal 算法时输出错误
【发布时间】:2016-08-23 01:59:05
【问题描述】:

我正在研究克鲁萨尔算法。但是我没有得到正确的输出。我不知道我在哪里犯了错误。

这是我的代码:

parent = dict()
rank = dict()

def make_set(vertice):
    parent[vertice] = vertice
    rank[vertice] = 0

def find(vertice):
    if parent[vertice] != vertice:
        parent[vertice] = find(parent[vertice])
    return parent[vertice]

def union(vertice1, vertice2):
    root1 = find(vertice1)
    root2 = find(vertice2)
    if root1 != root2:
        if rank[root1] > rank[root2]:
            parent[root2] = root1
        else:
            parent[root1] = root2
            if rank[root1] == rank[root2]: rank[root2] += 1

def kruskal(graph):
    for vertice in graph['vertices']:
        make_set(vertice)

    minimum_spanning_tree = set()
    edges = list(graph['edges'])

    for edge in edges:
        vertice1, vertice2, weight = edge
        if find(vertice1) != find(vertice2):
            union(vertice1, vertice2)
            minimum_spanning_tree.add(edge)
    return minimum_spanning_tree






graph = {
    'vertices': [0,1, 2, 3, 4, 5],
    'edges': set([     //(first node, second node, weight)
        (0, 3,5),
        (3, 5,2),
        ( 5, 4,10),
        ( 4, 1,3),
        (1, 0,8),
        (0, 2,1),(2,3,6),( 2,5,4),( 2,4,9),(2,1,7),
        ])
    }

a = kruskal(graph)

print(a)

我发现如果我将“Edges”更改为(权重,第一个节点,第二个节点)格式,我可以得到(权重,第一个节点,第二个节点)格式的正确答案。但是如果我想以(第一个节点,第二个节点,重量)格式使用“边缘”,我该如何修改它?

【问题讨论】:

  • edit您的问题包括您期望的输出。根据我的猜测,它应该是[(0, 2, 1), (3, 5, 2), (4, 1, 3), (2, 5, 4), (2, 1, 7)](在完整图表的 55 中的权重为 17)。对吗?

标签: python graph-theory minimum-spanning-tree kruskals-algorithm


【解决方案1】:

乍一看,试试这个:

edges = list(graph['edges'])

改为

edges = sorted(graph['edges'], key=lambda e: e[2])

【讨论】:

  • 为以后发现此问答的人澄清一下:Kruskal's algorithm 的关键是按从最小重量到最大重量的顺序测试边缘。 Running.Pig 的 kruskal 函数以它们碰巧从 graph['edges'] 集合中出来的任何顺序尝试它们。
猜你喜欢
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2013-01-17
  • 2012-03-16
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多