AT_abc325_e Our clients, please wait a moment 题解
AT_abc325_e Our clients, please wait a moment 题解
Date 20231024:请注意原题未说明清楚的,是走到的每一条边,都需要按照给出的公式计算。
这里介绍两种算法:「最短路+枚举」以及「分层图最短路」。
Solution 1:最短路+枚举
注意到,\(n\le1000\),那么我们就可以 \(\mathcal{O}(n)\) 的枚举「在哪一个城市换成火车」。
特别的,如果在 \(1\) 号城市换乘火车,说明没有乘坐汽车;如果在 \(n\) 号城市换成火车,则说明没用乘坐火车。
也就是将一条路径 \(1\rightarrow k_1\rightarrow k_2\rightarrow\cdots\rightarrow n\),分为两条路径,前面的部分乘汽车,后面的部分乘火车。
注意:原图是无负边权稠密图,因为 \(m=\frac{n(n-1)}{2}\),所以最好使用「朴素版 Dijkstra」。但是我不会写,所以顺手写了一个「堆优化 Dijkstra」。
Dijkstra 算法:求解单元最短路,即从 原点 出发,到其他所有点的最短距离;适用于 没有负权边,即所有边的长度都是正数。
思路:设集合 \(S\) 为已经求解出最短路的点集,从原点出发,每次选一个距离这个点集最近的点,加入点集 \(S\),并用这个点更新所有与它有直接连边的点。
代码:https://atcoder.jp/contests/abc325/submissions/46895951
Solution 2:分层图最短路
只有一次换乘的机会,所以我们可以跑分层图最短路。
建两层图,每一层都有 \(n\) 个点(可以形象的理解为「第一层是在汽车站,第二层是在火车站」)。
注意:分层图最短路,一般来说第 \(i\) 层的编号从 \(n\times(i-1)+1\) 开始编号,即第 \(1\) 层从 \(1\) 开始,第 \(2\) 层从 \(n+1\) 开始。
除了初始在两层图上独立的边 \((u,v)\)、\((u+n,v+n)\),然后额外连边 \((i,i+n)\),即从第一层的点 \(i\) 连到第二层的点 \(i+n\),边权为 \(0\)(表示「从汽车站到火车站不需要花费时间」,题目给出,说明出题人可以瞬移)。
然后就可以从 \(1\) 号点开始跑「最短路」,然后结果取 \(\min\{\mathit{dis}(n),\mathit{dis}(2n)\}\);然而这道题上下两层图之间的边权为 \(0\),所以直接取任意一个点的 \(\mathit{dis}\) 即可。
本文来自博客园,作者:RainPPR,转载请注明原文链接:https://www.cnblogs.com/RainPPR/p/solution-at-abc325-e.html
如有侵权请联系我(或 2125773894@qq.com)删除。