Алгоритм Дейкстра

"""
The below code provides an implementation
for the dijkstra's shortest path algorithm
(https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm).

Let v be the number of vertices of graph and e number of
edges in the input graph.

Time complexity: O(v^2 + e)
Space complexity: O(v)
"""
class Graph:
    def __init__(self, vertices, edges):
        self.V = vertices  # nb of vertices
        self.E = edges  # adjacency list

    # Print the lengths of shortest paths from
    # src to all the other nodes. If no path
    # is found, output would be -1.
    def print_min_dists(self, src, min_dist_list):
        print("Min distance from " + str(src) + ":")
        for vertex in range(self.V):
            print(vertex, "\t", min_dist_list[vertex])

    # Below function computes lengths of shortest paths
    # between src and all other vertices in the graph
    # using the Dijkstra's algorithm. Element at index i
    # in output list represents length of shortest path
    # from src to vertex i.
    def dijkstra(self, src):
        # Initially all distances are initialized to infinity
        min_dist_list = [float("inf")] * self.V
        min_dist_list[src] = 0
        # List of already visited nodes
        visited = set()

        # Loop until all nodes are processed
        while len(visited) != self.V:
            # The entire graph is searched for vertex having
            # min distance to source node.
            vertex, current_min_dist = self.get_vertex_min_dist(
                min_dist_list, visited)

            # If remaining nodes are not reachable, abort
            if current_min_dist == float("inf"):
                break

            # Mark current vertex as visited
            visited.add(vertex)

            # Update distances of nodes adjacent to current vertex
            for edge in self.E[vertex]:
                destination, dist_to_destination = edge
                if destination in visited:
                    continue
                new_path_dist = current_min_dist + dist_to_destination
                current_destination_dist = min_dist_list[destination]
                if new_path_dist < current_destination_dist:
                    min_dist_list[destination] = new_path_dist

        return list(map(lambda x: -1 if x == float("inf") else x, min_dist_list))

    # Get next vertex with min distance to source
    def get_vertex_min_dist(self, distances, visited):
        current_min_dist = float("inf")
        vertex = -1
        for vertex_idx, distance in enumerate(distances):
            if vertex_idx in visited:
                continue
            if distance <= current_min_dist:
                vertex = vertex_idx
                current_min_dist = distance
        return vertex, current_min_dist


vertices = 4
edges = {
    0: [(1, 2), (3, 6)],
    1: [(0, 2), (2, 2)],
    2: [(1, 2), (3, 1)],
    3: [(0, 6), (2, 1)]
}

graph = Graph(vertices, edges)
graph.print_min_dists(0, graph.dijkstra(0))
"""
Above outputs: 
Min distance from 0:
0        0
1        2
2        4
3        5
"""
Wissam