from collections import deque
graph = [
['a', 'b', 'c', 'd', 'e', 'f'],
['g', 'e', 'h', 'i', 'j'],
['k', 'l', 'i', 'n', 'm']
]
def graph_nodes(a_graph):
return list(set([node for _ in a_graph for node in _]))
def neighbours(a_graph, a_node):
node_neighbours = []
"""
Przegladamy kazda z list reprezentujacych graf i jesli napotkamy zadany wierzcholek, to zapamietujemy jego
poprzednika i nastepnika (o ile istnieja).
"""
for a_list in a_graph:
for i, element in enumerate(a_list):
if element == a_node and i + 1 < len(a_list):
node_neighbours.append(a_list[i + 1])
if element == a_node and i - 1 >= 0:
node_neighbours.append(a_list[i - 1])
return list(set(node_neighbours))
# Zwykle przechodzenie grafu
def find_path(a_graph, from_node, to_node):
nodes = graph_nodes(a_graph)
if from_node not in nodes or to_node not in nodes:
return None
visited = {n: False for n in nodes}
""" W kolejce pamietamy sciezke od zadanego wierzcholka"""
queue = deque([from_node])
while len(queue) > 0:
remembered_path = queue.pop()
current_node = remembered_path[-1] # Ostatni element sciezki to wierzcholek do dalszej analizy
visited[current_node] = True
if current_node == to_node:
return remembered_path
for node in neighbours(a_graph, current_node):
if not visited[node]:
visited[node] = True
new_path = [n for n in remembered_path]
new_path.append(node)
queue.append(new_path)
return None
print("Path={}".format(find_path(graph, 'd', 'n')))
print("Path={}".format(find_path(graph, 'a', 'm')))
print("Path={}".format(find_path(graph, 'k', 'j')))
print("Path={}".format(find_path(graph, 'FOO', 'BAR')))
print("Path={}".format(find_path(graph, 'a', 'BAR')))
# your code goes here
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKCmdyYXBoID0gWwogICAgWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZiddLAogICAgWydnJywgJ2UnLCAnaCcsICdpJywgJ2onXSwKICAgIFsnaycsICdsJywgJ2knLCAnbicsICdtJ10KXQoKCmRlZiBncmFwaF9ub2RlcyhhX2dyYXBoKToKICAgIHJldHVybiBsaXN0KHNldChbbm9kZSBmb3IgXyBpbiBhX2dyYXBoIGZvciBub2RlIGluIF9dKSkKCgpkZWYgbmVpZ2hib3VycyhhX2dyYXBoLCBhX25vZGUpOgogICAgbm9kZV9uZWlnaGJvdXJzID0gW10KCiAgICAiIiIKICAgIFByemVnbGFkYW15IGthemRhIHogbGlzdCByZXByZXplbnR1amFjeWNoIGdyYWYgaSBqZXNsaSBuYXBvdGthbXkgemFkYW55IHdpZXJ6Y2hvbGVrLCB0byB6YXBhbWlldHVqZW15IGplZ28gCiAgICBwb3ByemVkbmlrYSBpIG5hc3RlcG5pa2EgKG8gaWxlIGlzdG5pZWphKS4KICAgICIiIgogICAgZm9yIGFfbGlzdCBpbiBhX2dyYXBoOgogICAgICAgIGZvciBpLCBlbGVtZW50IGluIGVudW1lcmF0ZShhX2xpc3QpOgogICAgICAgICAgICBpZiBlbGVtZW50ID09IGFfbm9kZSBhbmQgaSArIDEgPCBsZW4oYV9saXN0KToKICAgICAgICAgICAgICAgIG5vZGVfbmVpZ2hib3Vycy5hcHBlbmQoYV9saXN0W2kgKyAxXSkKCiAgICAgICAgICAgIGlmIGVsZW1lbnQgPT0gYV9ub2RlIGFuZCBpIC0gMSA+PSAwOgogICAgICAgICAgICAgICAgbm9kZV9uZWlnaGJvdXJzLmFwcGVuZChhX2xpc3RbaSAtIDFdKQoKICAgIHJldHVybiBsaXN0KHNldChub2RlX25laWdoYm91cnMpKQoKIyBad3lrbGUgcHJ6ZWNob2R6ZW5pZSBncmFmdQpkZWYgZmluZF9wYXRoKGFfZ3JhcGgsIGZyb21fbm9kZSwgdG9fbm9kZSk6CiAgICBub2RlcyA9IGdyYXBoX25vZGVzKGFfZ3JhcGgpCgogICAgaWYgZnJvbV9ub2RlIG5vdCBpbiBub2RlcyBvciB0b19ub2RlIG5vdCBpbiBub2RlczoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHZpc2l0ZWQgPSB7bjogRmFsc2UgZm9yIG4gaW4gbm9kZXN9CgogICAgIiIiIFcga29sZWpjZSBwYW1pZXRhbXkgc2NpZXprZSBvZCB6YWRhbmVnbyB3aWVyemNob2xrYSIiIgogICAgcXVldWUgPSBkZXF1ZShbZnJvbV9ub2RlXSkKCiAgICB3aGlsZSBsZW4ocXVldWUpID4gMDoKICAgICAgICByZW1lbWJlcmVkX3BhdGggPSBxdWV1ZS5wb3AoKQogICAgICAgIGN1cnJlbnRfbm9kZSA9IHJlbWVtYmVyZWRfcGF0aFstMV0gIyBPc3RhdG5pIGVsZW1lbnQgc2NpZXpraSB0byB3aWVyemNob2xlayBkbyBkYWxzemVqIGFuYWxpenkKICAgICAgICB2aXNpdGVkW2N1cnJlbnRfbm9kZV0gPSBUcnVlCgogICAgICAgIGlmIGN1cnJlbnRfbm9kZSA9PSB0b19ub2RlOgogICAgICAgICAgICByZXR1cm4gcmVtZW1iZXJlZF9wYXRoCgogICAgICAgIGZvciBub2RlIGluIG5laWdoYm91cnMoYV9ncmFwaCwgY3VycmVudF9ub2RlKToKICAgICAgICAgICAgaWYgbm90IHZpc2l0ZWRbbm9kZV06CiAgICAgICAgICAgICAgICB2aXNpdGVkW25vZGVdID0gVHJ1ZQogICAgICAgICAgICAgICAgbmV3X3BhdGggPSBbbiBmb3IgbiBpbiByZW1lbWJlcmVkX3BhdGhdCiAgICAgICAgICAgICAgICBuZXdfcGF0aC5hcHBlbmQobm9kZSkKICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChuZXdfcGF0aCkKICAgIHJldHVybiBOb25lCgoKcHJpbnQoIlBhdGg9e30iLmZvcm1hdChmaW5kX3BhdGgoZ3JhcGgsICdkJywgJ24nKSkpCnByaW50KCJQYXRoPXt9Ii5mb3JtYXQoZmluZF9wYXRoKGdyYXBoLCAnYScsICdtJykpKQpwcmludCgiUGF0aD17fSIuZm9ybWF0KGZpbmRfcGF0aChncmFwaCwgJ2snLCAnaicpKSkKcHJpbnQoIlBhdGg9e30iLmZvcm1hdChmaW5kX3BhdGgoZ3JhcGgsICdGT08nLCAnQkFSJykpKQpwcmludCgiUGF0aD17fSIuZm9ybWF0KGZpbmRfcGF0aChncmFwaCwgJ2EnLCAnQkFSJykpKQojIHlvdXIgY29kZSBnb2VzIGhlcmU=
Path=['d', 'e', 'h', 'i', 'n']
Path=['a', 'b', 'c', 'd', 'e', 'h', 'i', 'n', 'm']
Path=['k', 'l', 'i', 'j']
Path=None
Path=None