这是一篇没有代码的博客。目的是在全是玄学复杂度的算法中留下有复杂度保证的算法。
原文摘自千年之狐_天才 :
靠谱做法应该是A+线段树。用A跑k短路,第一次跑到的一定是所给最短路,其次跑到的所有最短路将答案更新。如果只是单纯这样的话,是不行的,因为所有路径都会被更新一次。但是我们不难发现一个信息,假设将最短路径上的点标号0-n0−n,答案一定是0->u->v->n0−>u−>v−>n,u,vu,v在最短路上(这个题解也说到了),而且u->vu−>v与最短路交集为空。而且答案不会有两段不连续路径不和最短路有交集。因此我们在跑A*时记录一个optopt.
opt=0:if(下个点是最短路上的点)opt->0
else opt->1
opt=1:if(下个点是最短路上的点)opt->2
else opt->1
opt=2:线段树区间更新。
对于每个点,如果增广过来的左端点是一样的,只保留第一个,因为dis肯定是递增的,所以对于同一端点,每个点只会被增广到一次。(map or hash判断)这个非常关键否则可能被卡成指数级qwq。这样的话其实按理来讲应该就是O(mlogm)左右了。