from math import inf class Edge: length = 0 def __init__(self, start, end, length): self.length = length self.start = start self.end = end class Node: def __init__(self, xpos, ypos): self.xpos = xpos self.ypos = ypos class Graph: def __init__(self): self.edges = list() self.nodes = list() def add_node(self, xpos, ypos): self.nodes.append(Node(xpos, ypos)) def add_edge(self, start_index, end_index, length): self.edges.append(Edge(start_index, end_index, length)) def Dijkstra(graph, source_index, target_index): n = len(graph.nodes) if (target_index >= n): return None unvisited = list(range(n)) distances_from_start = [inf] * n distances_from_start[source_index] = 0 node_sequences = [list() for i in range(n)] node_sequences[source_index] = [source_index] while(True): try: current_index = min(unvisited, key = lambda i: distances_from_start[i]) except ValueError: break if current_index == target_index: break unvisited.remove(current_index) for edge in filter( lambda e: e.start == current_index or e.end == current_index, graph.edges): start = current_index end = edge.end if edge.start == current_index else edge.start if end in unvisited and distances_from_start[end] > distances_from_start[start] + edge.length: distances_from_start[end] = distances_from_start[start] + edge.length node_sequences[end] = node_sequences[start].copy() node_sequences[end].append(end) return node_sequences[target_index] graph = Graph() graph.add_node(1, 2) graph.add_node(4, 7) graph.add_node(3,1) graph.add_node(-2,0) graph.add_node(0,0) graph.add_edge(0, 1, 1) graph.add_edge(1, 2, 2) graph.add_edge(2, 3, 3) graph.add_edge(3, 0, 1) graph.add_edge(1, 3, 3) print(Dijkstra(graph, 0, 5))