hihoCoder [Offer收割]编程练习赛83 D 生成树问题

题目

从 Kruskal 算法的角度来思考这个问题。

考虑 $n$ 个点的“空图”(即没有边的图)。
先将 $m_2$ 条无权值的边加到图中,得到一个森林。

将 $m_1$ 条有权值的边按权值从小到大排序。
枚举这些边,对于边 $e\colon(u, v, w)$,若将 $e$ 加入图中之后

(i) 会形成环,这意味着 $u$ 到 $v$ 的路径上的所有边的权值都不大于 $w$;

(ii) 不会形成环,则将其加入图中。

我们需要解决的问题:$m_2$ 条原本无权值的边在形如“$u$ 到 $v$ 的路径上的所有边的权值都不大于 $w$”的约束之下,每条边的最大权值是多少。

可以用树链剖分来帮助计算。
复杂度 $O(n\log^2n)$

其实对 $m_1$ 条边按权值排序是不必要的,按什么顺序枚举这 $m_1$ 条边对结果并无影响。

Implementation

https://gist.github.com/GoBigorGoHome/6787ee01dbf1a2ba411d8baeea75e4a2

Warning: 以上所述仅供参考,未必正确。

猜你喜欢

转载自www.cnblogs.com/Patt/p/9981169.html
今日推荐