You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Dijkstra算法更换自定义图后触发KeyError报错如何解决

问题原因

这个报错是参考代码本身存在逻辑缺陷,你定义的图结构没有错误。

缺陷根源

Dijkstra算法的核心性质是:当某个节点被从优先队列中弹出时,就已经找到了从起点到该节点的最短路径,后续不需要再对该节点做任何更新操作。
你用的参考代码在弹出节点u时,直接将u从entry_finder字典中删除了,但是后续遍历其他节点的邻接边时,如果遇到已经被弹出、不在entry_finder中的节点,直接访问entry_finder[v]就会抛出KeyError。
之前的课堂示例可以正常运行,只是刚好示例图的结构不会触发「已处理节点作为其他节点邻接边目标」的场景,不代表代码没有问题。

修复方案

只需要在处理邻接边的逻辑前,加一层判断:如果邻接节点v已经不在entry_finder中,说明已经确定最短路径,直接跳过即可。
修改后的dijkstra函数循环部分代码如下:

while pq:
    d_u, u = pop_entry()
    if u is not None and u != REMOVED:
        costs[u] = d_u
        for e in G[u]:
            v, w = e
            # 新增判断:v已经被处理过就跳过
            if v not in entry_finder:
                continue
            entry_v = entry_finder[v]
            d_v = entry_v[0]
            if d_v > d_u + w:
                add_entry(v, d_u + w)
                pred[v] = u

修改后运行你定义的图,就能正常输出最短路径开销和前驱节点结果,不会再抛出KeyError。

内容的提问来源于stack exchange,提问作者Wilyanse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 17:36:07