1. 程式人生 > >hihoCoder [Offer收割]程式設計練習賽83 D 生成樹問題

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: 以上所述僅供參考,未必正確。