2725: [Violet 6]故乡的梦
Time Limit: 20 Sec
Memory Limit: 128 MB
Submit: 607
Solved: 190
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
6 7
1 2 1
2 3 1
3 4 2
4 5 1
5 6 1
1 3 3
4 6 3
1 6
4
1 2
1 3
4 3
6 5
Sample Output
7
6
Infinity
7
HINT
Source
interviewstreet--Going office
[ Submit][ Status][ Discuss]
先做一遍Dijkstra求出最短路,这样的路径可能很多,任取一条
删边操作如果不涉及所选择的路径,那么不会影响答案
以s为起点,再做一遍Dijkstra,求出最短路图,对于每个点,预处理
ds[i]:从s到i出发最短路长度,fs[i]:到达i的路径上,最早能在点fs[i]离开所选择的最短路
同理,以t为起点,求出dt[i]与ft[i],含义类似
这样,就能表示出所有强制经过一条边(x,y)的最优路径,即
s -> fs[x] -> x -> y -> ft[y] -> t
处理时,让fs[i]在所选最短路中尽量靠前,ft[i]在所选最短路中尽量靠后
这样,只要是删除所选路径里[fs[x],ft[y]]之间的边,总是能用路径s -> fs[x] -> x -> y -> ft[y] -> t代替
换句话说,如果不存在这样的替代品,就没办法找到s -> t最短路了
区间修改线段树完成,注意我们并不需要真的构建出最短路图,Dijkstra过程中就可以递推了
要处理的数组很多,注意下标。。一开始写炸了。。GG
#include
#include
#include
#include
#include
#include
#include
#include
#include