简要题意:
给定一个有向图,求从源点开始到各点的最短路。
前置知识:
首先,我们考虑把原来 Dijkstra \text{Dijkstra} Dijkstra 的算法考虑优化。
对于每个节点,松弛相邻节点,这部分无法优化。
但是寻找 dis \text{dis} dis 最小值的过程,我们可以用 优先队列(即小根堆)实现。
怎么实现呢?
考虑一开始源点入队,队列记录每个点的 当前 dis \text{dis} dis 最小值 和编号。
对当前节点,把所有相邻的节点松弛一遍,并把松弛成功的节点入队。
但是你发现一个问题,如果一个点被它相邻的点同时更新多次,就会入队多次,然后把一模一样的松弛进行很多遍,然后 O ( n 2 ) O(n^2) O(n2) 没了。
所以 因为我们开的是优先队列,因此入队的节点距离小的在前,每次对于相同的一个节点,先遍历的一定最优。因此可以开一个哈希记录是否走过,走过则不走即可。
时间复杂度: O ( n log n ) O(n \log n) O(nlog