У меня возникли проблемы, обертывая мою голову вокруг моего кода во вложенном цикле. Я следую алгоритму Кана здесь на wiki: Kahn's. Я не понимаю, как тестировать, если outgoingEdge имеет входящие ребра для каждого элемента endArray (m).Топологическая сортировка (алгоритм Кана)
Вот то, что я до сих пор:
def topOrdering(self, graph):
retList = []
candidates = set()
left = []
right = []
for key in graph:
left.append(key)
right.append(graph[key])
flattenedRight = [val for sublist in right for val in sublist]
for element in left:
if element not in flattenedRight:
#set of all nodes with no incoming edges
candidates.add(element)
candidates = sorted(candidates)
while len(candidates) != 0:
a = candidates.pop(0)
retList.append(a)
endArray = graph[a]
for outGoingEdge in endArray:
if outGoingEdge not in flattenedRight:
candidates.append(outGoingEdge)
#flattenedRight.remove(outGoingEdge)
del outGoingEdge
if not graph:
return "the input graph is not a DAG"
else:
return retList
Вот картина визуализируя мой алгоритм. График находится в виде списка смежности.
Ах, я забыл упомянуть, без пустых ключей допускается. –
@JeffreyPhung Что значит «пустые» ключи? '3' не должен находиться в списке смежности, потому что нет исходящих границ? – niemmi
В моем списке смежности нет 3 включенных. Поэтому из вашей логики будет ошибка исключения, и именно поэтому я пытался сделать это по-своему. С вашего пути, я думаю, мне нужно было бы создать еще один список смежности для каждого соседа снова? –