1. 程式人生 > >【NOI2018】歸程(kruskal重構樹+最短路+樹上倍增)

【NOI2018】歸程(kruskal重構樹+最短路+樹上倍增)

總的來說 從v通往1的道路 分為了步行和開車

也就是說 一個點u 他能作為分界點 當且僅當存在一條路徑(u,v)的海拔全部高於當天水位線 且(u,1)是最短路

很顯然 這是一個與瓶頸有關的問題 不難想到Kruskal重構樹

由於瓶頸是海拔 所以我們先建出以海拔為關鍵字的重構樹

由於是個小根堆 所以一個節點 子樹的海拔都大於他 換句話說 v能到達子樹裡的任意一點

所以我們可以預處理出一個子樹裡到1節點的最短路 對於一個查詢 我們在重構樹上倍增跳 直到找到一個點海拔比它深

程式碼可以參考神仙