专栏文章

P2934 [USACO09JAN] Safe Travel G——无向图最短路树及其性质

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minjzqp6
此快照首次捕获于
2025/12/02 03:39
3 个月前
此快照最后确认于
2025/12/02 03:39
3 个月前
查看原文
题面很简单,就是求出不走原本最短路最后一条边的情况下1号点到每个点的距离
一个错误的想法是,一边dijkstra搞掉原本最短路顺便记录最后一条边,然后查询每个点的时候就用这个点的邻接边去重新更新它
但是这样是错的,因为有些后边的点的最短路是依赖于这条边的,所以这些点的最短路也要相应发生改变
既然发现了这种依赖关系,就可以考虑用树来表达它
也就是说,从源点到所有点的所有最短路径并起来是一棵树(最短路径唯一的情况下)
这很显然,联通并且依赖的最后一条边只有一条,n-1条边的无向连通图

接下来考虑最短路树和我们要求的路径有什么关系
发现当断开一条边时,会发生改变的就只有这条边以下的点,而想要再到达这个点就必须走一条跨越两个子树的边
那么首先要证明的是,所走的路径中不在原树上的的只有这一条
如果加入了其它的边,并且优于原本只走一条的路径的话,那么最短路树上本来就应该有这一条边,证毕
于是,我们就只需要找所有跨越这两个子树的边,把它们的答案取一个最小即可
这条边确定后,这条路径的长度就为
disu+disv+w(u,v)disidis_u+dis_v+w(u,v)-dis_i
u,vu,v 为边的两端, ww 为边权, ii 为被切掉的边的下方节点
disdis 为原树上到 11 的距离
发现两部分相互独立,显然可以试着把问题转化成每条边会对怎样的点造成贡献
发现一条非树边可以造成的贡献是两个端点到LCA的路径扣掉LCA,原因与横跨两棵子树有关
到这里就可以用树链剖分做 log2\log^2 做法了
但是还是可以更精细一点,因为是最小值覆盖,只有最后最小值盖的那一下有用
可以直接从小到大排序,在树上用类似 白雪皑皑 的做法进行覆盖,并查集维护染色区间

评论

0 条评论,欢迎与作者交流。

正在加载评论...