📜  Dijkstra 最短路径算法的Python程序|贪心算法 7

📅  最后修改于: 2022-05-13 01:56:56.289000             🧑  作者: Mango

Dijkstra 最短路径算法的Python程序|贪心算法 7

给定一个图和图中的一个源顶点,找到从源到给定图中所有顶点的最短路径。
Dijkstra 的算法与 Prim 的最小生成树算法非常相似。像 Prim 的 MST 一样,我们生成一个以给定源为根的SPT(最短路径树) 。我们维护两组,一组包含包含在最短路径树中的顶点,另一组包含尚未包含在最短路径树中的顶点。在算法的每一步,我们都会找到另一个集合(尚未包含的集合)中的一个顶点,并且与源的距离最小。
以下是 Dijkstra 算法中用于查找从单个源顶点到给定图中所有其他顶点的最短路径的详细步骤。
算法
1)创建一个集合sptSet (最短路径树集),跟踪包含在最短路径树中的顶点,即计算并确定其与源的最小距离。最初,这个集合是空的。
2)为输入图中的所有顶点分配一个距离值。将所有距离值初始化为 INFINITE。将源顶点的距离值指定为 0,以便首先拾取它。
3)虽然sptSet不包括所有顶点:

  • 选择一个在sptSet中不存在且具有最小距离值的顶点 u。
  • 包括 u 到sptSet
  • 更新 u 的所有相邻顶点的距离值。要更新距离值,请遍历所有相邻顶点。对于每个相邻的顶点v,如果u的距离值(从源)与边uv的权重之和小于v的距离值,则更新v的距离值。
Python3
# Python program for Dijkstra's single
# source shortest path algorithm. The program is
# for adjacency matrix representation of the graph
class Graph():
 
    def __init__(self, vertices):
        self.V = vertices
        self.graph = [[0 for column in range(vertices)]
                      for row in range(vertices)]
 
    def printSolution(self, dist):
        print("Vertex \t Distance from Source")
        for node in range(self.V):
            print(node, "\t\t", dist[node])
 
    # A utility function to find the vertex with
    # minimum distance value, from the set of vertices
    # not yet included in shortest path tree
    def minDistance(self, dist, sptSet):
 
        # Initialize minimum distance for next node
        min = 1e7
 
        # Search not nearest vertex not in the
        # shortest path tree
        for v in range(self.V):
            if dist[v] < min and sptSet[v] == False:
                min = dist[v]
                min_index = v
 
        return min_index
 
    # Function that implements Dijkstra's single source
    # shortest path algorithm for a graph represented
    # using adjacency matrix representation
    def dijkstra(self, src):
 
        dist = [1e7] * self.V
        dist[src] = 0
        sptSet = [False] * self.V
 
        for cout in range(self.V):
 
            # Pick the minimum distance vertex from
            # the set of vertices not yet processed.
            # u is always equal to src in first iteration
            u = self.minDistance(dist, sptSet)
 
            # Put the minimum distance vertex in the
            # shortest path tree
            sptSet[u] = True
 
            # Update dist value of the adjacent vertices
            # of the picked vertex only if the current
            # distance is greater than new distance and
            # the vertex in not in the shortest path tree
            for v in range(self.V):
                if (self.graph[u][v] > 0 and
                   sptSet[v] == False and
                   dist[v] > dist[u] + self.graph[u][v]):
                    dist[v] = dist[u] + self.graph[u][v]
 
        self.printSolution(dist)
 
# Driver program
g = Graph(9)
g.graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0],
           [4, 0, 8, 0, 0, 0, 0, 11, 0],
           [0, 8, 0, 7, 0, 4, 0, 0, 2],
           [0, 0, 7, 0, 9, 14, 0, 0, 0],
           [0, 0, 0, 9, 0, 10, 0, 0, 0],
           [0, 0, 4, 14, 10, 0, 2, 0, 0],
           [0, 0, 0, 0, 0, 2, 0, 1, 6],
           [8, 11, 0, 0, 0, 0, 1, 0, 7],
           [0, 0, 2, 0, 0, 0, 6, 7, 0]
           ]
 
g.dijkstra(0)
 
# This code is contributed by Divyanshu Mehta


输出
Vertex      Distance from Source
0          0
1          4
2          12
3          19
4          21
5          11
6          9
7          8
8          14

请参考关于 Dijkstra 的最短路径算法的完整文章 |贪婪算法 7 了解更多详情!