下面的代码应该在图中执行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()