【问题标题】:Dijkstra Algorithm in Python takes way too longPython 中的 Dijkstra 算法耗时太长
【发布时间】:2021-09-21 22:02:30
【问题描述】:

我一直在尝试用 python 实现 Dijkstra 算法:

def shortest_path(self, start, end):
    pq = PriorityQueue()
    pq.insert(0, start)

    distances = {vertex: math.inf for vertex in range(self.graph.num_nodes)}
    prev_nodes = {vertex: None for vertex in range(self.graph.num_nodes)}
    visited = [False for vertex in range(self.graph.num_nodes)]
    distances[start] = 0
    prev_nodes[start] = start

    while pq.size() > 0:
        root = pq.get_min()
        cur_distance = root.key
        cur_vertex = root.value
        pq.delete_min()
        if cur_vertex == end:
            break

        if visited[cur_vertex] is False:

            for neighbor, weight in self.graph.adj_matrix[cur_vertex]:
                new_distance = cur_distance + weight
                if new_distance < distances[neighbor]:
                    distances[neighbor] = new_distance
                    prev_nodes[neighbor] = cur_vertex
                    pq.insert(new_distance, neighbor)

        visited[cur_vertex] = True

不幸的是,对于很长的路径来说,它需要的时间太长了。有什么办法可以进一步优化吗?

【问题讨论】:

标签: python dijkstra


【解决方案1】:

希望它会起作用

def solve(graph,visited,a,b): #a start vertex, b end vertex
    dist={}
    for node in visited:
        dist[node]=float("inf")
    dist[a]=0
    d=graph.copy()
    while d:
        mn=None
        for node in d: # finding closest vertex
            if not mn:
                mn=node
            elif dist[node]<dist[mn]:
                mn=node
        for child,cost in graph[mn].items(): #updating distance 
            if dist[mn]+cost<dist[child]:
                dist[child]=dist[mn]+cost
        d.pop(mn) # removing mn as we updated distance wrt this vertex
    return dist
 
n = int(input()) #number of vertices
graph = {}
visited={}
for i in range(n):
    u=input()
    graph[u]={}
    visited[u]=0
e = int(input())
for i in range(e):
    u, v, t = map(str, input().split()) # t is cost(must be positive)
    graph[u][v]=int(t)
a = input()
b = input()
print(solve(graph,visited, a, b))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多