graph = {'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E'],
'G': ['K']}
def push(array, item):
array.insert(0, item)
def pop(array):
return array.pop(0)
def dfs_paths(graph, start, goal):
paths = []
stack = [(start, [start])]
while stack:
(vertex, path) = pop(stack)
vertices = graph[vertex]
for next_vertex in (set(vertices) - set(path)):
new_path = path + [next_vertex]
if next_vertex == goal:
paths.append(new_path)
else:
push(stack, (next_vertex, new_path))
return paths
print dfs_paths(graph, 'A', 'F') # [['A', 'C', 'F'], ['A', 'B', 'E', 'F']]
def dfs_paths_rec(graph, start, goal, path=[]):
if start == goal:
path.append(start)
return path
paths = []
for next in set(graph[start]) - set(path):
new_path = dfs_paths_rec(graph, next, goal, path + [next])
paths.append(new_path)
return paths
print dfs_paths_rec(graph, 'A', 'F')
# [[[[[['C', 'A', 'B', 'E', 'F', 'F']], []]], ['C', 'F', 'F']], [[[['B', 'A', 'C', 'F', 'F']]], [['B', 'E', 'F', 'F']], []]]
Z3JhcGggPSB7J0EnOiBbJ0InLCAnQyddLAogICAgICAgICAnQic6IFsnQScsICdEJywgJ0UnXSwKICAgICAgICAgJ0MnOiBbJ0EnLCAnRiddLAogICAgICAgICAnRCc6IFsnQiddLAogICAgICAgICAnRSc6IFsnQicsICdGJ10sCiAgICAgICAgICdGJzogWydDJywgJ0UnXSwKICAgICAgICAgJ0cnOiBbJ0snXX0KCgpkZWYgcHVzaChhcnJheSwgaXRlbSk6CiAgICBhcnJheS5pbnNlcnQoMCwgaXRlbSkKCmRlZiBwb3AoYXJyYXkpOgogICAgcmV0dXJuIGFycmF5LnBvcCgwKQoKZGVmIGRmc19wYXRocyhncmFwaCwgc3RhcnQsIGdvYWwpOgogICAgcGF0aHMgPSBbXQogICAgc3RhY2sgPSBbKHN0YXJ0LCBbc3RhcnRdKV0KCiAgICB3aGlsZSBzdGFjazoKICAgICAgICAodmVydGV4LCBwYXRoKSA9IHBvcChzdGFjaykKICAgICAgICB2ZXJ0aWNlcyA9IGdyYXBoW3ZlcnRleF0KCiAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIChzZXQodmVydGljZXMpIC0gc2V0KHBhdGgpKToKICAgICAgICAgICAgbmV3X3BhdGggPSBwYXRoICsgW25leHRfdmVydGV4XQoKICAgICAgICAgICAgaWYgbmV4dF92ZXJ0ZXggPT0gZ29hbDoKICAgICAgICAgICAgICAgIHBhdGhzLmFwcGVuZChuZXdfcGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHB1c2goc3RhY2ssIChuZXh0X3ZlcnRleCwgbmV3X3BhdGgpKQoKICAgIHJldHVybiBwYXRocwoKcHJpbnQgZGZzX3BhdGhzKGdyYXBoLCAnQScsICdGJykgIyBbWydBJywgJ0MnLCAnRiddLCBbJ0EnLCAnQicsICdFJywgJ0YnXV0KZGVmIGRmc19wYXRoc19yZWMoZ3JhcGgsIHN0YXJ0LCBnb2FsLCBwYXRoPVtdKToKICAgIGlmIHN0YXJ0ID09IGdvYWw6CiAgICAgICAgcGF0aC5hcHBlbmQoc3RhcnQpCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBwYXRocyA9IFtdCiAgICBmb3IgbmV4dCBpbiBzZXQoZ3JhcGhbc3RhcnRdKSAtIHNldChwYXRoKToKICAgICAgICBuZXdfcGF0aCA9IGRmc19wYXRoc19yZWMoZ3JhcGgsIG5leHQsIGdvYWwsIHBhdGggKyBbbmV4dF0pCiAgICAgICAgcGF0aHMuYXBwZW5kKG5ld19wYXRoKQoKICAgIHJldHVybiBwYXRocwoKcHJpbnQgZGZzX3BhdGhzX3JlYyhncmFwaCwgJ0EnLCAnRicpCgojIFtbW1tbWydDJywgJ0EnLCAnQicsICdFJywgJ0YnLCAnRiddXSwgW11dXSwgWydDJywgJ0YnLCAnRiddXSwgW1tbWydCJywgJ0EnLCAnQycsICdGJywgJ0YnXV1dLCBbWydCJywgJ0UnLCAnRicsICdGJ11dLCBbXV1d