--- id: 6559da93115de78dbbdc7ba3 title: Schritt 54 challengeType: 20 dashedName: step-54 --- # --description-- As a final step, modify your function call passing `F` as the third argument and check the output. With that, the shortest path algorithm is complete. # --hints-- You should call `shortest_path` passing `my_graph`, `'A'` and `'F'` as the arguments. ```js ({ test: () => assert.match(code, /^shortest_path\s*\(\s*my_graph\s*,\s*("|')A\1\s*,\s*("|')F\2\s*\)/m) }) ``` # --seed-- ## --seed-contents-- ```py --fcc-editable-region-- my_graph = { 'A': [('B', 5), ('C', 3), ('E', 11)], 'B': [('A', 5), ('C', 1), ('F', 2)], 'C': [('A', 3), ('B', 1), ('D', 1), ('E', 5)], 'D': [('C',1 ), ('E', 9), ('F', 3)], 'E': [('A', 11), ('C', 5), ('D', 9)], 'F': [('B', 2), ('D', 3)] } def shortest_path(graph, start, target = ''): unvisited = list(graph) distances = {node: 0 if node == start else float('inf') for node in graph} paths = {node: [] for node in graph} paths[start].append(start) while unvisited: current = min(unvisited, key=distances.get) for node, distance in graph[current]: if distance + distances[current] < distances[node]: distances[node] = distance + distances[current] if paths[node] and paths[node][-1] == node: paths[node] = paths[current][:] else: paths[node].extend(paths[current]) paths[node].append(node) unvisited.remove(current) targets_to_print = [target] if target else graph for node in targets_to_print: if node == start: continue print(f'\n{start}-{node} distance: {distances[node]}\nPath: {" -> ".join(paths[node])}') return distances, paths shortest_path(my_graph, 'A') --fcc-editable-region-- ``` # --solutions-- ```py my_graph = { 'A': [('B', 5), ('C', 3), ('E', 11)], 'B': [('A', 5), ('C', 1), ('F', 2)], 'C': [('A', 3), ('B', 1), ('D', 1), ('E', 5)], 'D': [('C',1 ), ('E', 9), ('F', 3)], 'E': [('A', 11), ('C', 5), ('D', 9)], 'F': [('B', 2), ('D', 3)] } def shortest_path(graph, start, target = ''): unvisited = list(graph) distances = {node: 0 if node == start else float('inf') for node in graph} paths = {node: [] for node in graph} paths[start].append(start) while unvisited: current = min(unvisited, key=distances.get) for node, distance in graph[current]: if distance + distances[current] < distances[node]: distances[node] = distance + distances[current] if paths[node] and paths[node][-1] == node: paths[node] = paths[current][:] else: paths[node].extend(paths[current]) paths[node].append(node) unvisited.remove(current) targets_to_print = [target] if target else graph for node in targets_to_print: if node == start: continue print(f'\n{start}-{node} distance: {distances[node]}\nPath: {" -> ".join(paths[node])}') return distances, paths shortest_path(my_graph, 'A', 'F') ```