У меня есть направленный ациклический c граф (заданный матрицей смежности), узел источника и узел приемника. Я хотел бы найти набор путей P
мощности не более, чем число ребер от источника до приемника, чтобы для каждого ребра e
в графе существовал путь p
в P
что такое e
находится в p
.
Моя идея состояла в том, чтобы найти все пути в графе и как только я закрою все ребра, я остановлюсь. Я думаю, что эта идея не самая лучшая и, вероятно, есть лучший способ.
Я начал с этот код :
def all_paths(adjm, source, sink, path, edges):
# def covered(E, P):
# e = []
# for p in P:
# e.extend([(p[i], p[i + 1]) for i in range(len(p) - 1)])
# if set(e) == set(E):
# return True
# else:
# return False
path = path + [source]
if source == sink:
return [path]
paths = []
for child in range(source + 1, adjm.shape[0]): # I assume that the nodes are ordered
if adjm[source, child] == 1:
if child not in path:
# if not covered(edges, paths):
paths.extend(all_paths(adjm, child, sink, path, edges))
return paths