[kruskal重构树] P6765 [APIO2020] 交换城市
posted on 2025-05-06 13:59:13 | under | source
题意:\(n\) 点 \(m\) 边无向连通图,边有边权。\(q\) 次询问,给两个点 \(x,y\),你需要让两辆车分别从 \(x,y\) 出发,要求任意时间不能在同一边或点上,可以原地等待,不要求简单路径,求经过的最大边权最小?\(n\le 10^5,m,q\le 2\times 10^5\)。
因为对路径没什么要求,所以用连通块(所有经过的边)的视角来看。不难发现,一个连通块合法当且仅当它不是链。合法必然存在三度点或环,容易构造方案。
考虑枚举答案 \(c\),边越多越好,所以将所有 \(\le c\) 的边都加入,判断是否是链即可。
容易想到 kruskal 重构树,但是要稍微改一改,因为有些边不能被忽略:
- 当前边两端不连通:若其一非链,则非链;反之,是链当且仅当连接了两端点。
- 当前边两端连通:显然一定非链。当原来是链转化为非链则新建点作为当前连通块对应点的父亲。均摊正确。
修改后的做法是没错的,相当于在原树上的某些边上插入新的点,所以不影响我们求 \(lca\)。
查询就从 \(lca\) 往上跳到第一个非链节点,\(O((n+q)\log n)\)。
当然,你甚至可以直接让新点连向连通块上所有叶子,就不用查询时倍增了。

浙公网安备 33010602011771号