Учитывая структуру сообщества (список списков):
[[A,B,C], [B,D,E,G], [A,C,F,H],[F,K, H]]
и предполагается, что каждое ребро имеет вес 1, не ориентированный в подгруппе.
Я хотел бы найти самого влиятельного человека, который имеет самую короткую связь с G, F (минимальной суммой краев), применяя поиск по ширине / глубине для каждого человека.
Вотуниверсальный код поиска в ширину:
def bfs_paths(graph, start, goal):
queue = [(start, [start])]
while queue:
(vertex, path) = queue.pop(0)
for next in graph[vertex] - set(path):
if next == goal:
yield path + [next]
else:
queue.append((next, path + [next]))
Дело в том, что «граф» должен быть представлен в виде списка смежности.Например:
graph = {'A': set(['B', 'C', 'F', 'H']),
'B': set(['D', 'E','G']),
'C': set(['A', 'F', 'H']),
'D': set(['B', 'E', 'G' ]),
'E': set(['B', 'D', 'G' ]),
'F': set(['K', 'H']),
'G': set(['B', 'D', 'E'])
'H': set(['K', 'F']}
Основной вопрос: Как преобразовать структуру (список) сообщества в список смежности?
Дополнительный вопрос: Есть ли другой подходящий алгоритм?
Edit1: я пытался следовать этому stackoverflow post .Но я застрял в улучшении кода для достижения ожидаемого результата