在python中实现路径压缩的find中的无限循环

时间:2014-11-23 02:57:47

标签: python graph dijkstra union-find

我在Python中实现Dijkstra和Kruskal算法,以便在随机图(常规图和密集图)中找到最大带宽路径。但是,当我运行Kruskal算法生成最大生成树并且调用操作find时,它会在查找操作的循环内部引起无限循环(这发生在常规图形或密集图形中)。这个错误很奇怪,因为之前一切正常,有时查找操作对两个图都有效。我通过遵循类中给出的伪代码实现了find操作。我的部分代码是:

class Disjoint:
    def __init__(self,size):
        """
        Equivalent to MakeSet
        Vertices are numbered from 1 to size
        """
        self.parent = [0]*(size+1)
        self.rank = [0]*(size+1)

    def find(self,v):
        R = [] #stack
        r = v

        while self.parent[r] != 0:
            #sometimes this loop never stops (infinite loop)
            R.append(r)
            r = self.parent[r]

        while len(R) != 0:
            w = R.pop()
            self.parent[w] = r
            del w

        del R
        #del w
        return r

    def __del__(self):
        del self.parent
        del self.rank

更新: 问题解决了,查找功能是对的。问题是我在Kruskal函数中遇到的逻辑错误。

2 个答案:

答案 0 :(得分:0)

    while self.parent[r] != 0:
        #sometimes this loop never stops (infinite loop)
        R.append(r)
        r = self.parent[r]

while self.parent[r] == 0:
        break
else:
        R.append(r)
        r = self.parent[r]

答案 1 :(得分:0)

if self.parent[r] == 0:
    pass
    #print("error", self.parent[r])
else:
    while self.parent[r] (equal to or greater) 1:
        R.append(r)
        r = self.parent[r]
    else:
        #print("error", self.parent[r])

P.s我只是一名学生,刚毕业的Cert IV Networking IT