SDOI2017 天才黑客(虛樹+最短路)

WAautomaton發表於2019-02-12

題目連結

題目大意

有向圖,每條邊有邊權,也對應了樹上某個點。從一條邊走到另一條邊時的花費是該邊邊權以及對應樹上點的LCA深度之和。
求1號點到其他所有點的最短路。
n,m50,000n,m\le 50,000

題解

顯然的做法是每條邊變成點,加上邊權點權後跑最短路。但是這樣邊數是O(m2)O(m^2)的,我們需要進行優化。
對於原圖中一個點,我們把所有和他相鄰的邊全部拿出來,把他們對應的點在樹上掛出來形成虛樹,考慮虛樹上任意一個點,所有LCA在這個點及這個點之上的點對都可以連一條權值為它深度的邊。
於是我們把所有對應出來的點按照dfs序排序,列舉每個間隔,所有跨過這個間隔的點對都可以連上權值為這個間隔LCA深度的邊。
然而這樣邊數還是O(m2)O(m^2)的,我們可以考慮給剛才這個序列建出字首節點,字尾節點,每次連邊可以看做是字首節點和字尾節點之間的連邊,邊數就是O(m)O(m)的了。因此總複雜度為O(mlogn)O(mlogn)

咦,程式碼呢?它咕了。

相關文章