Python Prim';s算法不';t生成正确的生成树 def prim(图形): que=队列。优先级队列() mst=[] 访问=设置() #使用元组生成边缘信息并将其推送到优先级队列 对于graph.keys()中的外部_键: 对于内部\u键,图[outer\u key]中的内部\u成本。项() que.put((内螺纹成本、外螺纹键、内螺纹键)) 当que.empty()为False时: edge=que.get() 成本,frm,至=边缘 如果要访问: 持续 已访问。添加(frm) 已访问。添加(到) mst.append(边缘) 对于下一个到,成本在图[to]中。项() 如果下一个\u未访问: que.put((成本、收件人、次收件人)) 返回mst

Python Prim';s算法不';t生成正确的生成树 def prim(图形): que=队列。优先级队列() mst=[] 访问=设置() #使用元组生成边缘信息并将其推送到优先级队列 对于graph.keys()中的外部_键: 对于内部\u键,图[outer\u key]中的内部\u成本。项() que.put((内螺纹成本、外螺纹键、内螺纹键)) 当que.empty()为False时: edge=que.get() 成本,frm,至=边缘 如果要访问: 持续 已访问。添加(frm) 已访问。添加(到) mst.append(边缘) 对于下一个到,成本在图[to]中。项() 如果下一个\u未访问: que.put((成本、收件人、次收件人)) 返回mst,python,Python,我正在用Python制作非常简单的Prim算法。在这段代码中,图形是用嵌套字典生成的。我将所有边(元组)推送到优先级队列,从中逐个获取它们,检查它是否是访问的顶点,并将相邻顶点推送到优先级队列 但是,最终生成树的形状如下所示: 2 [A] [B]-------[C] | 5 | | [D]--------[E] [F] 6 |

我正在用Python制作非常简单的Prim算法。在这段代码中,图形是用嵌套字典生成的。我将所有边(元组)推送到优先级队列,从中逐个获取它们,检查它是否是访问的顶点,并将相邻顶点推送到优先级队列

但是,最终生成树的形状如下所示:

                   2
  [A]        [B]-------[C]
   |
 5 |
   |
  [D]--------[E]       [F]
         6              |
                    +---+
                    | 3
             [G]----+ 

我想知道问题在哪里以及如何解决。谢谢。

普里姆的算法从任意顶点开始。然后将其所有边添加到优先级队列并启动循环

您将all边添加到队列中(可能您与Kruskal混淆了,Kruskal做了其他事情)

因此,工作代码是:

def prim(graph):
    que = queue.PriorityQueue()
    mst = []
    visited = set()

    # Generate edge information with tuple and push it to Priority Queue
    #for outer_key in graph.keys():
    #    for inner_key, inner_cost in graph[outer_key].items():
    #        que.put((inner_cost, outer_key, inner_key))

    starting_vertex = list(graph.keys())[0]

    for next_to, cost in graph[starting_vertex].items():
        if next_to not in visited:
            que.put((cost, starting_vertex, next_to))

    while que.empty() is False:
        edge = que.get()
        cost, frm, to = edge

        if to in visited:
            continue

        visited.add(frm)
        visited.add(to)
        mst.append(edge)

        for next_to, cost in graph[to].items():
            if next_to not in visited:
                que.put((cost, to, next_to))

    return mst