神仙图论题
神仙题,考察了较多图论知识,关于连通性,边双的结论,缩树,妙用并查集,离线,线段树等知识,《难度适中》,是一道很好的题!
题意
给出一个无向图,边有权值,对于每个点,求出起点到它所有坤皇路径的权值权值的最小值。
坤皇路径的定义:经过每条边至多一次,可以多次经过同一个点。
权值:路径上的 \(\max + \min\)
\(n,m\leq 3\times 10^5\)。
思路与部分分
\(\max\) 怎么做 ?
考虑从小到大加入每条边,使用启发式合并维护连通块,在每一个连通块被联通时更新答案。思维类似归程那个题。
时间复杂度 \(O(m(\log m+\log n))\) 。
怎么才给 9 分? 怎么才给 9 分?怎么才给 9 分?
\(\min\) 怎么做 ?
枚举 \(\min\) , 现在变成了点 \(u\) 到 点 \(v\) 是否存在一条经过边 \(e\) 的坤皇路径,这个问题有一个结论:
在边双连通分量 \(S\) 内,任意两点 \(u,v\) 之间必然存在一条 \(u\to v\) 的路径经过边双内的任意一条其他边 \(e\) 。
所以边双缩树,1 能经过某条边到达的边双内的点都满足条件。
我最开始在这里想了很久并试图只加入 \(\geq \min\) 的边动态维护边双啥的,靠判断连通性,但是对后面的做法是没有帮助的,在这个时候没有必要转化为可行性问题。 直接把 \(\min\) 看作权值,那么一个边双的权值就是所有里面的边的 \(\min\) ,树上到根的路径的 \(\min\) 即可直接求出。
这也启发着我们 把“全都满足”看作只加入某些边合法,把“存在满足”看作权值,当作最优性问题去解决,不一定都要放到时间轴上出现。
时间复杂度 \(O(m(\log m+\log n))\) 。
怎么才给 15 分? 怎么才给 15 分?怎么才给 15 分?
\(\min+\max\) 怎么做?
\(O(m^2)\)
考虑像前面维护 \(\max\) 的方式从小到大加入每一条边,像前面维护 \(min\) 的方式一样维护权值,每加入一条边后重新维护边双树的结构,更新权值和答案,就可以做到 \(O(m^2)\) 。
还是有差不多 30 分吧,洗洗睡了。
\(O(n^2)\)
发现这棵边双树的结构总共只会发生至多 \(O(2n)\) 次改变,其中 \(O(n)\) 次是因为连通性的改变,\(O(n)\) 次是因为边双形态的改变 ,即缩了树上的一个环,若连边的两个端点已经处于同一个边双里了,就不用再更新任何东西了。
\(O((n+m)\log n+m \log m)\)
考虑刚刚那个动态的过程是不好在线维护的,我们先建出最终的连通性树:显然是最小生成树,然后中途加入的边改变的连通性是可以维护的,使用启发式合并维护。 接下来我们要维护的是边双的合并:在树上加一条边产生的合并边双显然是 \(u - LCA- v\) 路径上的所有点被合并到一个边双里,产生新的权值,这种变化是可以使用并查集在树上维护的,(并查集常常用于维护这种在树上或者序列上每个点只会被删除/修改一次的问题),同时维护边双的连通关系,将边双挂在并查集的顶端。
关于答案的统计:
每个点在第一次与点 \(1\) 在原图意义上联通后暴力更新这片子树的答案,同最开始做 \(\max\) 的那样,时间复杂度显然正确,为了知道每个被更新的位置的最值,需要拿一棵区间取 \(\min\) 的线段树维护到根路径的 \(\min\)。
当一堆点被合并为一个边双后,若 \(\min\) 是这个边双中的某条边,\(\max\) 为现在的时间点,那么对这个点子树中的已经联通的位置进行答案的更新,仅用考虑 \(\min\) 是这个边双中的情况,其它情况在 \(\max\) 更小的时候已经被考虑过了,用一个区间取 \(\min\) , 单点修改的线段树维护就可以了,在连通后覆盖掉之前没用的权值就行。
时间复杂度 \(O((n+m)\log n+m \log m)\) 常数大,但是通过 \(3\times 10^5\) 还是很轻松的。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17093852.html,谢谢你的阅读或转载!