Page Top

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}\) 即可。

代码:https://atcoder.jp/contests/abc325/submissions/46897682

posted @ 2023-10-24 16:26  RainPPR  阅读(35)  评论(0编辑  收藏  举报