CF864F Cities Excursions 题解

· · 题解

:::::info[题目基本信息] 考察:倍增,广度优先搜索 BFS,图论(2700)。
题目简介:
给定一个有 n 个点 m 条边的有向图,q 次询问,每次询问所有从 st 的路径中经过的顶点序列字典序最小的路径顶点序列的第 k 项是什么,若不存在路径或不存在最小给出 -1
数据范围:

时间限制:2s。
空间限制:250MB。
::::: 注意到 q 较大,nm 较小,考虑预处理。
首先考虑枚举 st 之间的一个,我们注意到枚举 t 时每个点的下一个要走的点都可以唯一确定,建反图跑一遍就可以,所以我们考虑枚举 t
枚举 t,对于每一个点 i,找到最小与它相连的的 j 使得 j 能够到达 t(这个可以在最开始跑 n 遍 BFS 实现,后文称 ji 的后继),建反图跑一遍判断每个点能否走字典序最小的路径到达 t,这样我们就可以判掉 -1,考虑如何处理答案。
枚举 t 的过程中,我们找到了每一个点的后继,我们采用倍增的方式容易预处理并计算出答案。
然后做完了。
时间复杂度为 \Theta(nm+n^2\log V+m\log m+q\log V),空间复杂度为 \Theta(n^2\log V+m),其中 Vk 的值域。
:::::warning[坑点] 本做法比较卡空间,倍增数组需要开 short
:::::

code