1. 程式人生 > >DP練習1題解D

DP練習1題解D

DP練習1題解D

先上題目描述

在這裡插入圖片描述

樣例輸入
10
1 2
2 3
3 4
4 5
6 7
7 8
8 9
9 10
3 8
樣例輸出
3
8

emmm 因為POJ炸了 和上面講的好像有一點小區別(也可能我沒聽懂)
我不知道能不能過 所以。。
明天看下 先寫在這裡 不貼程式碼了

首先是個圖 n(n<=10000)個結點 n-1的邊
合適用鄰接表儲存
也就是個樹
是個樹狀DP
斷掉一個點後 它之下的各個子樹 和除了該點和它之下的點這棵樹 構成了森林
要讓每個樹節點數小於等於n/2
斷掉一個點要滿足條件 也就是要除了該點和它之下的點總數小於等於n/2
並且它的子樹中最大的樹節點數小於等於n/2
我們可以從底部出發動歸 傳遞上述兩個狀態 如果有點符合就輸出

我的思路是用s陣列儲存相連的邊數
d表儲存連線情況 a陣列儲存它之下的點總數 和之下的最大的樹節點數
拓撲排序結合DP
如果只有一條邊和他相連 加入佇列q
q不空就進行迴圈
取出一個只剩一個邊的元素
判斷是否符合 符合輸出
相連的是它的父節點 向他傳遞狀態
然後刪除節點 更新父節點的表

以上

ps:GH當時刷不出來 沒看 沒做 明天寫 要看英語了T_T要考四級了了了了了了了了了了