【问题标题】:Dijkstra algorithm not working even though passes the sample test cases即使通过了示例测试用例,Dijkstra 算法也不起作用
【发布时间】:2020-06-27 16:42:02
【问题描述】:

所以我遵循了维基百科的 Dijkstra 算法伪代码以及 Brilliants。 https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Pseudocodehttps://brilliant.org/wiki/dijkstras-short-path-finder/。这是我的代码不起作用。谁能指出我的代码中的缺陷?

# Uses python3

from queue import Queue

n, m = map(int, input().split())
adj = [[] for i in range(n)]

for i in range(m):
    u, v, w = map(int, input().split())
    adj[u-1].append([v, w])
    adj[v-1].append([u, w])

x, y = map(int, input().split())
x, y = x-1, y-1
q = [i for i in range(n, 0, -1)]
#visited = set()
# visited.add(x+1)
dist = [float('inf') for i in range(len(adj))]
dist[x] = 0
# print(adj[visiting])
while len(q) != 0:

    visiting = q.pop()-1
    for i in adj[visiting]:
        u, v = i
        dist[u-1] = dist[visiting]+v if dist[visiting] + \
            v < dist[u-1] else dist[u-1]
# print(dist)
if dist[y] != float('inf'):
    print(dist[y])
else:
    print(-1)



【问题讨论】:

    标签: python algorithm graph dijkstra


    【解决方案1】:

    您的算法未正确实现 Dijkstra 算法。您只是按输入顺序遍历所有节点,并根据节点的当前距离更新到邻居的距离。但是后一个距离不能保证是最短距离,因为您在某些节点“转弯”之前对其进行了迭代。 Dijkstra 算法指定处理节点的特定顺序,不一定是输入顺序。

    您的算法中缺少的主要成分是优先级队列。您确实从 Queue 导入,但从不使用它。此外,它缺少将节点标记为已访问,您似乎已经实现了一些概念,但您已将其注释掉。

    Wikipedia 上的算法大纲解释了在每次迭代的最后一步中使用此优先级队列:

    1. 否则,选择标记为最小暂定距离的未访问节点,设置为新的“当前节点”,返回步骤3。

    您的代码中目前没有选择距离最小的访问节点的机制。相反,它会根据输入中的顺序选择下一个节点。

    要更正您的代码,请查阅同一维基百科页面上提供的伪代码,我建议您使用变体 with priority queue

    在 Python 中,您可以使用 heapq 对优先级队列(heappushheappop)执行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多