问题1 : 图上单源最短路径 用 最小堆找当前距离起始点的最短距离

系统提供的堆操作没法实现修改一个位置节点的值,让他自动调整成堆。比如
PriorityQueue 添加了一个自定义的Node节点,然后修改这个Node节点的属性值,他不会给你自动调整好。
image.png
下面的这个NodeHeap
首先你要获取到修改某个值的节点元素,
image.png
核心点:
1、查节点在哪个位置上,小根堆是用数组维护的,修改一个节点的值,要找到节点,所以需要一个索引字典,相当于探针。
2、Node是根据哪个值来比价大小呢,是根据每个Node到起始点的距离,但是这个distance是Dijkstra算法中定义的,不属于Node本身属性,所以还需要个distanceMap字典,这样改造的小根堆就变成存储key-value,还能modify了。
image.png
3、过滤操作还是需要,只不过在edge.to进堆的时候判断是否进过堆,就是addOrUpdateOrIgnore方法;
image.png
image.png
弹出的时候要对索引进行-1赋值。
image.png
tips:

  • 因为distance选的是Math.min,所以节点更新后只会经历往上调整的过程。所以只用heapifyInsert就行。
  • 虽然这里ignore是考虑的,但是代码最好写成显式的。

4、两个节点交换位置,索引也要交换image.png
5、insert 和 heapify
image.png