求次短路时,分为简单路径上次短路和普通次短路(可遍历重复点);
-
普通次短路可以通过一次堆优化dijkstra(朴素版不可行)的过程中时刻维护最大与次大最短路得出;
-
而简单路径次短路,因为无法遍历重复的点,所以不可用堆dj的方法,朴素的方法是枚举删除最短路上某一条边,每次重跑1~n最短路维护一个min值,这个min值就是次短路。显然此方法效率不高;
-
还有一种高效的 $O(mlogn)$ 的方法, 洛谷:P2685 [TJOI2012]桥 ,通过预处理最短路树网络、最短路前驱后继,以最短路上的边为区间建线段树,枚举所有非最短路上的边尝试更新树上区间,最后树中的每一段最小区间的值取max即是次短路的长度。 细节写在博客里