题意:
给你一个
n
n
n个点
m
m
m条边的有向图,有一个东西一开始在
1
1
1号点,要最快的走到
n
n
n号点。无重边自环。
有两种操作:第一种是花费
1
1
1的时间走一条边,第二种是花费
2
k
−
1
2^{k-1}
2k−1的时间将图上所有边反向,
k
k
k表示当前是这个操作第
k
k
k次进行。
求从
1
1
1到
n
n
n的最短时间。
由于翻转操作会让答案很大,所以答案模
998244353
998244353
998244353
题目保证有解。
1
<
=
n
,
m
<
=
2
e
5
1<=n,m<=2e5
1<=n,m<=2e5
题解:
一个比较特别的分层图题目。一般来讲,分层图题目都是能分
k
k
k层的,这个
k
k
k的题目中某个特殊操作能进行的次数,但是这里这个操作最多可以进行
n
n
n次,所以看上去又不像分层图题目。
所以这个题目的关键就是分析如何分层。我们设在图上经过的边的条数是 A A A,翻转图的次数是 B B B,那么答案会是 A + 2 B − 1 A+2^B-1 A+2B−1。我们分两种情况考虑, B < = ⌈ l o g 2 m ⌉ B<=\lceil log_2^m\rceil B<=⌈log2m⌉和 B > ⌈ l o g 2 m ⌉ B>\lceil log_2^m\rceil B>⌈log2m⌉。
为什么这么分类呢?原因是第二种情况不存在翻转之后有“近路”可走的情况了,因为多翻转一次花费的代价比把所有边都走一遍还要大,所以只有答案是第一种的情况才可能出现多翻转一次图来“抄近路”的情况。
下面分别考虑两种情况怎么做。
对于第一种,显然最多翻转 ⌈ l o g 2 m ⌉ \lceil log_2^m\rceil ⌈log2m⌉次图,那么我们就建这么多层图,相邻两层图的内部的边方向是相反的,每层内部的边权都是1,两层对应点之间的权值是 2 k − 1 2^{k-1} 2k−1, k k k为终点所在的层数,然后在这个图跑最短路,找每层终点最短路最小的就行了。
对于第二种,我们相当于权值变了,层数变成了一个第一优先级的权值,边数变成了第二优先级的权值,我们想去做一个两种权值的最短路。这次我们不能建 n n n层图了,但是可以让每条边有两个权值,一个表示走这条边是否要层数 + 1 +1 +1,一个表示走这条边是否要边数 + 1 +1 +1。这里建图的方法是建两层图,一层正向图一层反向图,然后两层对应点之间连正反两条层数 + 1 +1 +1边数不变的边,然后层内的边都是层数不变边数 + 1 +1 +1的边。于是跑一遍这种意义下的最短路,就可以得到答案了。
复杂度两个 l o g log log( l o g log log层,最短路再一个 l o g log log)。