2018年3月7日

TIOJ1163 施工中的道路

高一的時候遇過類似的題目


題目:



如圖,給你一張圖(可能不連通),然後路上的邊權代表這條路要維修幾天

Q次詢問,每次問你A走到B最少幾天後可以到達
例如圖中A~D點,最快3天可到

做法:

從greedy的想法,我們希望任兩點的路徑都選在愈小的邊愈好
要到達一個點,選取有連接他的邊中權重最小的邊E
而E的另一端也選取連接他的邊中權重最小的邊
一直連,任兩點要有路徑,所以最後會連成一棵樹,而且事實上他就是最小生成樹

於是我們現在知道所求的答案都在樹上
若每次詢問就做一次DFS找路徑上的最大邊,複雜度O(QN),會超時

這時候可以利用倍增法+LCA
F[i][j]紀錄j的第2^i倍祖先
然後由兩點沿路爬到LCA,順便紀錄走過的邊的最大值
複雜度O(NlogN + QlogN),分別是建表(F[][])跟詢問

code:
C陣列判斷是否連通


沒有留言:

張貼留言