使用相邻矩阵的DFS失败

时间:2019-03-07 11:21:37

标签: python depth-first-search adjacency-matrix

下面的代码应该在图中执行DFS。由于性能原因,我使用了邻接矩阵。我的伪算法如下:

1)选择一个起始节点i

2)将节点添加到visited

3)从unvisited

删除节点

4)对于j中的每个其余节点unvisited,检查邻接矩阵中是否存在边(i,j),如果是,转到1),然后使用j作为起始节点。

由于与列表相关的时间复杂性(我从列表中删除O(n),但从集合中删除O(1)),因此我使用集合而不是列表来跟踪已访问/未访问。

给定最简单的图形(n = 3,[1,2],[2,3] [1,2]),代码将失败。它返回一个错误。

File "solution.py", line 51, in dfs
    self.unvisited.remove(start)
KeyError: 2

我该如何做?

完整代码:

class GraphMat:
    def __init__(self,n):
        self.size = n
        self.adjMat = [[False for i in range(n)] for j in range(n)]
        self.visited = set()
        self.unvisited = set([i for i in range(n)])
        self.path = []

    def allVisited(self):
        return len(self.unvisited) == 0

    def getFirstUnv(self):
        return next(iter(self.unvisited))

    def addEdge(self,u,v):
        self.adjMat[u-1][v-1] = True
        self.adjMat[v-1][u-1] = True

    def p(self):
        for i in self.adjMat:
            print i
        print '\n'

    def getUnvisited(self):
        return self.unvisited

    def dfs(self,start):
        print 'Visiting %d'%start

        self.path.append(start)
        print self.path
        self.visited.add(start)
        self.unvisited.remove(start)
        arr = [i for i in self.unvisited if self.adjMat[start][i]]
        print arr
        if len(arr) == 0:
            return
        for i in arr:
            self.dfs(i)

def main():
    g = GraphMat(3)
    for i in [[1,2],[1,3],[2,3]]:
        g.addEdge(i[0],i[1])
    g.dfs(0)


main()

0 个答案:

没有答案