1. 程式人生 > 其它 >Codeforces 70E Information Reform 題解

Codeforces 70E Information Reform 題解

Codeforces 70E Information Reform 題解

這道題給人的直覺是樹形dp,但採用傳統的 dp 狀態設計是不行的,難以處理點的覆蓋與建立基站的關係。

改變思路,考慮到每個點都要依賴恰好一個基站,乾脆把當前點依賴的基站記進狀態

\(dp_{i,j}\) 為子樹 \(i\) 都被覆蓋,點 \(i\) 依賴的是 \(j\) 時的最小代價

首先,假設 \(j\) 基站是新建的,再加上距離的代價,那麼初始代價為 \(k + d_{dis_{i,j}}\)。從 \(i\) 的每一個子結點 \(son\) 轉移。我們想到有兩種轉移方式:

1.\(son\) 以前就依賴自己的基站,那麼其實不用新建了,要減一個 \(k\)

,代價為 \(dp_{son,j} - k\)

2.讓 \(son\) 依賴對於它最優的基站,代價為 \(dp_{son,opt_{son}}\)\(opt[i]\) 表示使子樹 \(i\) 被覆蓋費用最小時選的基站,順便維護一下即可)。

這就是最直觀的轉移方式,它確實是對的,但有一個問題:如果多個子結點的 \(opt\) 等於 \(j\),那不會把代價算少了嗎?

轉移 \(1\) 裡減掉的 \(k\) ,第一次是對 \(i\) 減的,後面幾次都是對上一個 \(opt = j\) 的結點減的,所以正好不重不漏。

至於輸出路徑,列舉每個子結點,如果轉移 1 費用小,就走轉移 1,否則走轉移 2。也沒有那麼恐怖。