对dijkstra算法的再思考

这篇文章的起因是这道题。本题的题解中提到了广义dij这个东西。我个人的理解是dij只是一个模板,只要能完成其中的关键性质,那么跑的东西可以不是最短路。

考虑最短路dij的正确性到底是基于什么的:在每次把dis最小的点加入当前集合时,我们可以断言这个点不会再被其他点松弛。在最短路中这一点很好证明:其他点的dis不小于dis最小的点(设dis最小的点的dis为x),即使经过若干轮扩展,其他点的dis也一定是当前某点的dis+1个非负值。这个值显然不小于x。

换而言之,只要能证明“在每次把某个点加入当前集合时,我们可以断言这个点不会再被其他点松弛”,那么这个算法就是正确的。这道题中,把时间标在边上,维护到每个点的最早时间 \(d_{i}\)。转移可以看题解,这里不赘述。可以发现用最短路类似的证明证得这样dij就是对的。

2022威海F也是类似的想法,跑一个有向瓶颈生成树,这个也可以用类似的方法证明dij的正确性。

posted @ 2023-11-03 14:01  永无岛  阅读(7)  评论(0编辑  收藏  举报