题解
首先求一个最短路图出来,最短路图就是这条边在最短路上就保留,否则就不保留,注意最短路图是一个有向图,一条边被保留的条件是
dis(S,u) + val(u,v) = dis(v,T)我们需要求两遍最短路
然后我们发现就相当于在最短路图上走一段,然后走一段非0的部分
我们把旧图保留,在上面连一些边权为0的有向边,从U到V求一遍最短路,由于最短路图是有向的,我们再从V到U求一遍最短路
然而……WA了?
我们发现我们最短路图上下来之后,可能会又走到最短路图上,但是同时选中两条路径是不可能的,我们希望的是在最短路上走一段,下来,并且再也不回到最短路图上
这样我们考虑分层图,设置三个状态,第一个状态是没有走到最短路图上,第二个状态是走到了最短路图上,第三个状态是走下来
所以要写两个dij,感觉代码还是十分的不优美,但是思路比较巧妙?
代码
#include
#include
#include
#include
#include
#include
#include