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

探讨有向图中每条边对应树上一点,边权与LCA深度之和作为花费,求1号点到所有点最短路的问题。通过将边转化为点并加入边权点权,利用虚树和DFS序优化边数,最终实现O(mlogn)的复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目大意

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

题解

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

咦,代码呢?它咕了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值