#python #depth-first-search #adjacency-matrix
#python #поиск в глубину #смежность-матрица
Вопрос:
Приведенный ниже код должен выполнять 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()
Комментарии:
1. Проверьте, находится ли start в unvisited.
2. Это отлично работает! Однако сейчас я сталкиваюсь с проблемой, что в некоторых случаях, похоже, возвращает неправильный результат. Я не вижу конкретного ввода / вывода, кроме того, что обычно это очень большие числа (n<=10e5). Может ли это быть причиной сбоя?