时间复杂度:O(K *(E * log(K)+ V * log(V)))
O(K * V)的存储复杂度(用于存储输入的+ O(E))。
我们执行修改后的Djikstra,如下所示:
- 对于每个节点,与其保持从起始节点开始的路由的当前最佳已知成本,不然。我们保留从起始节点出发的最佳K条路线
- 在更新节点的邻居时,我们不检查它是否改善了当前已知的最佳路径(就像Djikstra所做的那样),我们不检查它是否改善了K’当前已知的最差路径。
- 在我们已经处理完一个节点的K条最佳路由之后,我们不需要找到K条最佳路由,而只剩下K-1条,之后又有K-2条。那就是我所说的K’。
- 对于每个节点,我们将为K’当前最好的已知路径长度保留两个优先级队列。
- 在一个优先级队列中,最短路径在最上面。我们使用此优先级队列来确定哪个K’最好,并将在常规Djikstra的优先级队列中用作节点的代表。
- 在另一个优先级队列中,最长的路径在最上面。我们用这个比较候选路径和最差的K’路径。



