Вы можете использовать networkx
для этого.Начните с построения сети, используя keys
в качестве узлов и значения как edges
.Однако для ребер потребуется немного дополнительной работы, учитывая, что ребра должны быть списками кортежей, содержащих (source_node, dest_node
).
Таким образом, способ справиться с этим - получить все значения ключа комбинаций из всех записей в словаре.
Для узлов вам просто потребуется:
nodes = list(adj_list.keys())
Теперь давайте получим список ребер из словаря.Для этого вы можете использовать следующее понимание списка:
edges = [(k,val) for k, vals in adj_list.items() for val in vals]
# [(1, 2), (1, 4), (2, 1), (2, 3), (2, 4)...
Итак, этот список содержит записи в dict в виде простого списка кортежей:
1: [2, 4] -> (1, 2), (1, 4)
2: [1, 3, 4, 8] -> (2, 1), (2, 3), (2, 4), (2, 8)
...
Теперь давайте построим сетьс соответствующими узлами и ребрами:
import networkx as nx
G=nx.Graph()
G.add_edges_from(edges)
G.add_nodes_from(nodes)
Построив сеть, чтобы найти шаги между различными узлами, вы можете использовать shortest_path
, что дастВы точно самый короткий путь между двумя заданными узлами.Поэтому, если вы хотите найти кратчайший путь между узлами 1
и 10
:
nx.shortest_path(G, 1,10)
# [1, 2, 3, 7, 10]
Если вас интересует длина, просто возьмите len
из списка.Давайте посмотрим на другой пример:
nx.shortest_path(G, 1,6)
# [1, 2, 3, 6]
Это легче проверить путем непосредственного построения сети:
nx.draw(G, with_labels = True)
plt.show()
Где в случае кратчайшего пути между узлами 1
и 10
, как можно видеть, промежуточные узлы [1, 2, 3, 7, 10]
: