Что вы можете сделать, это просто рассмотреть текущий путь, по которому вы идете. Для последнего посещенного узла создайте соответствующий новый путь и добавьте его в 'siz
', который я переименовал в node_paths
. Затем выполните повторение для каждого соседа.
Поскольку путь, заданный для f
(см. Код ниже), является копией , вам не нужно вручную удалять добавленный узел (однако, если, например, например, вы используете path.append(node)
, когда вы выходите f
, вам, таким образом, придется path.pop()
)
data = [
(1, 2, 1),
(1, 3, 2),
(2, 4, 4),
(3, 4, 8),
]
adj = {}
w = {}
node_paths = {}
for (src, dst, weight) in data:
if src not in adj:
adj[src] = []
if dst not in adj:
adj[dst] = []
adj[src].append(dst)
adj[dst].append(src)
w[(src, dst)] = weight
w[(dst, src)] = weight
def f (path, weight, node, node_paths):
if node in path:
return
path_to_node = path + [node]
weight_to_node = weight + w[(path[-1], node)]
if node not in node_paths:
node_paths[node] = []
node_paths[node].append((path_to_node[1:], weight_to_node))
for neigh in adj[node]:
f(path_to_node, weight_to_node, neigh, node_paths)
node_paths = {}
start = 1
w[(-1, start)] = 0
f([-1], 0, start, node_paths)
print(node_paths)
#{1: [([1], 0)], 2: [([1, 2], 1), ([1, 3, 4, 2], 14)], 4: [([1, 2, 4], 5), ([1, 3, 4], 10)], 3: [([1, 2, 4, 3], 13), ([1, 3], 2)]}
В приведенном выше коде я сохраняю как путь, так и взвешенную сумму, чтобы упростить отладку, но вы очевидно, может отбросить сохраненный путь
Несколько моментов:
- При отладке просто избегайте ввода пользовательских данных и жесткого кода, это помогает воспроизводимость и ускоряет попытки
- Хорошее свойство 1,2,4,8 в том, что (учитывая двоичное представление) любая комбинация (среди чисел), которую вы берете, даст другую сумму, которая «уникально» описывает ваш путь (даже если там у нас просто есть путь в распоряжении в любом случае)
- Я не следовал вашему алгоритму, потому что думаю, что он не работает для диаграмм с ромбами, как на приведенном выше графике (даже если в ориентированном графе нет цикла) (поскольку мы, вероятно, собираем одинаковые пути) (но я просто угадал, не проверял предположение и может ошибаться)