CF1442C Graph Transpositions 分层图 最短路 (无代码)

12 篇文章 0 订阅
4 篇文章 0 订阅

题目链接

题意:
给你一个 n n n个点 m m m条边的有向图,有一个东西一开始在 1 1 1号点,要最快的走到 n n n号点。无重边自环。
有两种操作:第一种是花费 1 1 1的时间走一条边,第二种是花费 2 k − 1 2^{k-1} 2k1的时间将图上所有边反向, 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+2B1。我们分两种情况考虑, 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} 2k1 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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值