http://2014.sprout.csie.org/oj/pro/179/
2009 TOI 研習營初選,割點的進化問題。
題目問怎麼樣拔掉一個點可以使從一個根DFS走訪的點數最少。
其實就是找割點,重點是如何得知哪個割點割出來最小。
我們可以知道,如果一個點是割點,拔掉他,會讓其中一顆子樹或是多顆子樹斷掉,那我們先寫一個DFS可以統計走訪個數,順便找割點。
如果某個點的某個子樹最高只能走到這個點或以下,那代表這個點是割點,也間接代表拔掉該點會拔掉該子樹,所以把DFS這個子樹的點的總和加到一個陣列裡,代表拔掉這個點會拔掉多少子節點,要注意可能同時拔掉好多顆子樹,所以判完不能break要跑完。
最後,只要 for i in 1…n,如果 i 是割點,用點的總數(剛剛DFS統計過,因為圖有可能不連通,不能直接用 n)減掉 i 點子樹的節點數+1( i 也要算進去)去更新最小值就好。
因為根節點是不是割點並不會影響題目(題目要求不能拔根),所以跟的特判就省了。
1 |
|