Я уже некоторое время борется с этим. задано множество узлов:широта первый поиск/глубина первого поиска или режиссерский график?
nodes = { ('A','B'),
('B','C'),
('C','D'),
('C','E'),
('B','E'),
('C','F') }
, что является лучшим способом для достижения следующего:
A
|
B
_________|_________
| |
C E
_____|_____ |
| | | C
D E F ____|____
| |
D F
, где я могу видеть, что:
the routes from A -> B:
A -> B
the routes from A -> C:
A -> B -> C
A -> B -> E -> C
the routes from A -> D:
A -> B -> C -> D
A -> B -> E -> C -> D
etc...
Моя причина для этого, является потому что я хочу понять, как это сделать.
Я знаю, что BFS находит самый быстрый маршрут, (я думаю, я мог бы использовать что-то подобное в функции получить ребенок)
, но я не знаю, лучший путь к петле/рекурсивно работать над графиком. Должен ли я использовать словарь и работать с ключом/vals или списком. Или устанавливает ...
def make_graph(nodes):
d = dict()
for (x,y,*z) in nodes:
if x not in d: d[x] = set()
if y not in d: d[y] = set()
d[x].add(y)
d[y].add(x)
return d
Я использую * г здесь, как кортежи фактически будет включать в себя поплавок, но на данный момент я пытаюсь держать вещи простыми.
def display_graph(nodes):
for (key,val) in make_graph(nodes).items():
print(key, val)
# A {'B'}
# C {'B', 'E', 'D', 'F'}
# B {'A', 'C', 'E'}
# E {'C', 'B'}
# D {'C'}
# F {'C'}
GetChildren функция находит все возможные конечные точки для корневого узла:
def getchildren(noderoot,graph):
previousnodes, nextnodes = set(), set()
currentnode = noderoot
while True:
previousnodes.add(currentnode)
nextnodes.update(graph[currentnode] - previousnodes)
try:
currentnode = nextnodes.pop()
except KeyError: break
return (noderoot, previousnodes - set(noderoot))
В этом случае A:
print(getchildren('A', make_graph(nodes)))
# ('A', {'C', 'B', 'E', 'D', 'F'})
возможно дубликат [Как я могу преобразовать серию родитель-потомок в виде иерархического дерева?] (Http://stackoverflow.com/questions/2915748/102441). Не тот же язык, но та же проблема – Eric
Почему 'E' не отображается под' C' слева? – Eric
Два каждого из C, D, F? Вы уверены, что хотите дерево, а не ориентированный граф? –