Python 当组合权重小于节点权重时,放入队列的原因是什么?
正如您看到的代码,首先,在检查边缘顶点是否未被访问但它是错误的之后,我将边缘顶点堆入队列。 为了得到正确的答案,如果组合值小于顶点权重,我必须在检查值后进行叠加。 为什么呢Python 当组合权重小于节点权重时,放入队列的原因是什么?,python,algorithm,dijkstra,Python,Algorithm,Dijkstra,正如您看到的代码,首先,在检查边缘顶点是否未被访问但它是错误的之后,我将边缘顶点堆入队列。 为了得到正确的答案,如果组合值小于顶点权重,我必须在检查值后进行叠加。 为什么呢 for edge in current.edge_list: if edge.to_vertex.is_not_visited(): ## I first appended the to_vertex to the queue, but it does not work
for edge in current.edge_list:
if edge.to_vertex.is_not_visited():
## I first appended the to_vertex to the queue, but it does not work
total_weight = current_weight + edge.weight
if total_weight < edge.to_vertex.key:
heapq.heappush(queue, edge.to_vertex)
edge.to_vertex.key = total_weight
edge.to_vertex.parent = current
current.visited = True
我假设您已经在顶点类中定义了_ult_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。将距离信息存储为属性可能会在更改顶点的关键点属性值时破坏最小堆不变量。在你的代码片段中,我没有看到任何重建不变量的东西 说明:虽然to_顶点在min堆中的位置与之前相同,但您可能已将其关键点更改为小于其父项或大于其任何子项。当您将检查“总权重
也许这意味着你找到了较短的路由,以后检查这个路由是很好的。不确定我是否理解正确,你最初在注释的某个位置有heappush,除了heappush ofc之外的其他代码都是完全相同的?它现在还能工作吗?当您找到任何成本低于初始成本的路径时,您会将节点标记为已访问。我猜您会将其设置为INF,因此基本上,每次您找到任何路径时,都会发生这种情况,不一定是最短的路径。只有当从堆中获取节点时,才应该标记该节点,这样才能确保找到最短路径。代码的其余部分还可以,heappush的位置应该没有任何区别,除了使用的内存。该代码工作异常,并通过一些在线判断。我只是想知道我不确定的事情。谢谢你们。