1函数prim的算法python

时间:2017-02-21 15:48:22

标签: python algorithm python-2.7 prims-algorithm

我试图在python中制作一个1函数prims算法,但它似乎没有工作

def prim(edges):
    inGraph = ['A']
    discovered = []
    results = []
    counter = 0
    while True:
            tmplist = []
            for i in edges:
                    if inGraph[counter] in i:
                            discovered.append(i)
                            tmplist.append(i)
            for i in tmplist:
                    edges.remove(i)
            tmp = []
            for i in discovered:
                    tmp.append(i[2])
            mini = tmp.index(min(tmp))
            alpha = discovered[mini][0]
            beta = discovered[mini][1]

            if alpha not in inGraph or beta not in inGraph:
                    if alpha in inGraph:
                            inGraph.append(beta)
                    elif beta in inGraph:
                            inGraph.append(alpha)
                    results.append(discovered[mini])
            discovered.pop(mini)
            if discovered == []:
                    break
            counter+=1

    return (inGraph, results)

打印[[' A',' B',1],[' A',' C',102],[ ' B',' C',4],[' C',' F',2],[' B&# 39;,' F',1],[' F',' E',1]] print prim([[' A',' B',1],[' A',' C',102],[& #39; B',' C',4],[' C',' F',2],[' B&#39 ;,' F',1],[' F',' E',1]])

问题出在发现的某个地方,要么if语句检查它是否为空或从中删除一个元素。我只是不确定把它放在哪里

1 个答案:

答案 0 :(得分:1)

想象一下,只有一个顶点与'A'相连,比如'B'。因此,在第一次迭代时,您将只发现一个边缘。将'B'添加到inGraph后,您只会弹出已发现的边缘。

所以你发现的== []变为真,循环中断,即使可能仍有数千条边与'B'连接。

要终止主循环,计算顶点的数量,如果len(inGraph)== no_of_vertex,则计算中断。

为此,你可以:

V = set()
for e in edges:
    v.add(e[0])
    v.add(e[1])
no_of_vertex = len(V)
V = None #To help garbage collector