1378 夾克老爺的憤怒
夾克老爺逢三抽一之後,由於採用了新師爺的策略,鄉民們叫苦不堪,開始組織起來暴力抗租。
夾克老爺很憤怒,他決定派家丁常駐村中進行鎮壓。
諾德縣 有n個村莊,編號0 至 n-1,這些村莊之間用n - 1條道路連線起來。
家丁都是經過系統訓練的暴力機器,每名家丁可以被派駐在乙個村莊,並鎮壓當前村莊以及距離該村莊不超過k段道路的村莊。
夾克老爺一貫奉行最小成本最大利潤的原則,請問要實現對全部村莊的武力控制,夾克老爺需要派出最少多少名家丁?
input
第1行:2個數n, k中間用空格分隔(1<= n <= 100000, 0 <= k <= n)。input示例之後n-1行:每行2個數s, e中間用空格分隔,表示編號為s的村莊同編號為e的村莊之間有道路相連。(0 <= s, e output
輸出乙個數說明要實現對全部村莊的武力控制,夾克老爺需要派出最少多少名家丁?
4 1output示例0 10 2
0 3
1官方題解:
樹形dp,貪心思想,從葉子節點向上,能不放就不放,到了k長就放乙個。
後序遍歷,記錄不同子樹上傳的狀態,子樹狀態記錄為該子樹可以向上管理的(缺少的用負數)
可能a子樹放置的家丁可以把b子樹的村莊全部覆蓋,這樣就可以節約家丁數了。
min_length = min(dp[child])
max_length = max(dp[child])
if(min_length <= -k) else if(max_length + min_length > 0) else
最後如果root的狀態小於0要額外多放乙個。
1 #include 2 #include 3 #include 4**5const
int inf=0x3f3f3f3f;6
const
int maxn=100010;7
8int
n,k,ans;910
intdp[maxn];
1112
bool
vis[maxn];
1314 std::vectorgraph[maxn];
1516 inline void read(int&x)
2223
void dfs(int
num) 33}
34if(mn==inf) dp[num]=-1;35
else
if(mn<=-k) ++ans,dp[num]=k;
36else
if(mn+mx>0) dp[num]=mx-1;37
else dp[num]=mn-1
;38 vis[num]=false;39
}4041int
hh()
44for(int x,y,i=1;ii)
50 dfs(1
);51
if(dp[1]<0) ++ans;
52 printf("
%d\n
",ans);
53return0;
54}5556
int sb=hh();
57int main(int argc,char**argv)
51Nod 1378 夾克老爺的憤怒
一棵樹,可以進行染色,被染色的點可以控制與它距離不超過 k 的所有點,問控制整棵樹最少需要染幾個點.貪心.記錄一下最深的未染色點和最淺的染色點,判斷一下能否在子樹中就完成,不能的話就把權值賦成最深未染色點深度 1,能的話就賦成染色點深度 1.需要特判一下根.include include inclu...
51Nod 1378 樹形DP 貪心
題目鏈結 題意 給定一棵樹和乙個整數k kk,可以在樹的任意位置放置乙個人,這個人可以監管距離其所在節點不超過k kk的所有節點,問最少放置多少個人可以監管整棵樹的所有節點。思路 此題的解題思路還挺具有啟發意義。對於樹的相關問題,我們可以考慮先轉換成線性問題來做,如果是線性的話,很顯然最優解應該是從...
51Nod 1380 夾克老爺的逢三抽一
acm模版 首先發一下官方題解吧 按照官方題解寫的 發現自己一直在第 21 組資料 tl e 很明顯,這組資料是後來加上去專門卡資料的。於是發現自己的 中忽略了乙個部分是暴力的思維,在查詢左右兩側可選的村民時,我用了兩個迴圈,這顯然是不行的,所以我需要使用鍊錶的思維,這樣查詢的複雜度就是 o 1 了...