SDOI2017 天才黑客(虚树+最短路)

题目链接

题目大意

有向图,每条边有边权,也对应了树上某个点。从一条边走到另一条边时的花费是该边边权以及对应树上点的LCA深度之和。
求1号点到其他所有点的最短路。
n , m 50 , 000 n,m\le 50,000

题解

显然的做法是每条边变成点,加上边权点权后跑最短路。但是这样边数是 O ( m 2 ) O(m^2) 的,我们需要进行优化。
对于原图中一个点,我们把所有和他相邻的边全部拿出来,把他们对应的点在树上挂出来形成虚树,考虑虚树上任意一个点,所有LCA在这个点及这个点之上的点对都可以连一条权值为它深度的边。
于是我们把所有对应出来的点按照dfs序排序,枚举每个间隔,所有跨过这个间隔的点对都可以连上权值为这个间隔LCA深度的边。
然而这样边数还是 O ( m 2 ) O(m^2) 的,我们可以考虑给刚才这个序列建出前缀节点,后缀节点,每次连边可以看做是前缀节点和后缀节点之间的连边,边数就是 O ( m ) O(m) 的了。因此总复杂度为 O ( m l o g n ) O(mlogn)

咦,代码呢?它咕了。

猜你喜欢

转载自blog.csdn.net/WAautomaton/article/details/87110343