[SDOI2017]天才黑客

考虑拆边为点\((in_i \to out_i)\ in\ c_i\)

考虑点的贡献,将一个点周围一圈的边均连边,其代价为 \(LCP(S_i,S_j)\).

但发现这样连边数高达 \(O(M^2)\) .

发现实际上本质不同 \(LCP\) 只有 \(O(M)\) 个,考虑 \(LCP\)\(trie\) 上的 \(LCA\) 即可。

完全可以建出虚树,按 \(dfn\) 序排序,实际上即是区间内的 \(dep\) 最低点。

那么完全可以使用前缀/后缀优化建图,这样只需要连\(O(M)\)边即可。

接着使用 \(dij\) 算法求最短路即可。

posted @ 2022-03-27 16:13  fhq_treap  阅读(40)  评论(0编辑  收藏  举报