题意:
给你一个
n
n
n个点
m
m
m条边的有向带权图,给你输入一条长度为
l
l
l的从
1
1
1到
n
n
n的最短路,问你把最短路上每一条边删去后从
1
1
1到
n
n
n的最短路长度是多少。
n
<
=
1
e
5
,
m
<
=
2
e
5
n<=1e5,m<=2e5
n<=1e5,m<=2e5
题解:
首先对于一条起点和终点都在这条最短路上,且本身不属于这条最短路的边,它的影响是最短路上连续的一段边,它们中任意一条被删去,答案都可以是原来的起点到这条边的起点加上这条边的长度再加上它到终点的长度。于是我们可以把这条最短路上的点按起点到终点的顺序变成一个序列,这样一条边的影响就变成了一个区间,可以用数据结构维护了。
但是显然除了最短路上的边,其他的边并不只是起点和终点都在最短路上的。对于其他边,影响也是类似的。用到这条边的新最短路,长度一定是起点到这条边的起点的最短路,加上这条边的长度,再加上这条边的终点到目标点的最短路。所以我们。需要处理起点到每个点的最短路和每个点到终点的最短路,其中后者将图反过来,用终点做源点跑最短路。这条边所影响的范围,说起来比较绕,来试图用数学语言描述一下。假设指定的最短路经过的点依次是 v 1 , v 2 , . . . , v l ( v 1 = 1 , v l = n ) v_1,v_2,...,v_l(v_1=1,v_l=n) v1,v2,...,vl(v1=1,vl=n),那么对于一条不在指定最短路上的边 ( u , v ) (u,v) (u,v),设从 1 1 1到 u u u的每一条最短路中,属于顶点序列 v 1 , v 2 , . . . , v l v_1,v_2,...,v_l v1,v2,...,vl且顺序最靠后的点中,最靠前的是 v i v_i vi,从 v v v到 n n n的每一条最短路中,属于顶点序列 v 1 , v 2 , . . . , v l v_1,v_2,...,v_l v1,v2,...,vl且顺序最靠前的点中,最靠后的是 v j v_j vj,它影响的区间是 [ i , j ] [i,j] [i,j]。当然,这个区间可能会有开闭的问题,这里不仔细讨论了。这样转化之后,每条边的影响就变成了一个区间,然后拿个线段树维护区间最小值就行了。复杂度是一个 l o g log log。
代码暂时没有。
杂事乱记:
转眼间已经一年没发博客了,但是博客还是没挂退役标签。犹豫再三,最后决定再打最后一年。
说一下为什么没写代码,主要是感觉现在会做写不出的时候很少,想不出的时候很多,所以想多练思维,把时间用在思考和总结上,打了这么多年竞赛,用一些不是很复杂的算法来解题在实现上并不算困难,更何况ACM还有模板可以参照。