LG3783 题解
题意
给定一张有向图,每条边上有一个边权以及一个字符串。
一条有向路径的长度为这条路径上每条边的边权之和+按照路径的顺序将这些边上的字符串排成一列,相邻两个串的 \(\text{lcp}\) 长度之和。
求 \(1\) 号点到其他店的最短路。
用所有边上的字符串构造字典树,保证其大小 \(\le 2\times10^4\)。
\(1\le n,m\le5\times10^4\)。
题解
先考虑暴力做法:将每条边拆成入点和出点,入点和出点之间连边,权值为原边权;若两条边 \(a,b\) 满足 \(a\) 的终点是 \(b\) 的起点,则 \(a\) 的出点与 \(b\) 的入点连边,权值为 \(a,b\) 的 \(\text{lcp}\) 长度。跑一遍 \(\text{dij}\) 即可。复杂度 \(O(m^2\log m)\)。
瓶颈在边数。对点 \(i\),将所有终点为 \(i\) 的边放入集合 \(S\),将所有起点为 \(i\) 的边放入集合 \(T\)。不难发现 \(S\) 与 \(T\) 之间两两取 \(\text{lcp}\),不同的字符串个数是 \(O(|S|+|T|)\) 级别的。于是考虑优化建图。
权值为 \(\text{lcp}\) 的长度,就是字典树上 \(\text{lca}\) 的深度。取其欧拉序,就是区间最小值。此时用线段树或 \(\text{ST}\) 表优化建图已经可以做到 \(O(m\log m)\) 条边,也就是 \(O(m\log^2m)\) 复杂度。更进一步,考虑欧拉序上每个点的贡献,会将其前缀所有点与后缀所有点连边。用前后缀优化建图可以做到 \(O(m\log m)\) 复杂度。