51Nod 1378 夾克老爺的憤怒

2021-08-09 08:49:16 字數 1682 閱讀 1512

1378 夾克老爺的憤怒

夾克老爺逢三抽一之後,由於採用了新師爺的策略,鄉民們叫苦不堪,開始組織起來暴力抗租。

夾克老爺很憤怒,他決定派家丁常駐村中進行鎮壓。

諾德縣 有n個村莊,編號0 至 n-1,這些村莊之間用n - 1條道路連線起來。

家丁都是經過系統訓練的暴力機器,每名家丁可以被派駐在乙個村莊,並鎮壓當前村莊以及距離該村莊不超過k段道路的村莊。

夾克老爺一貫奉行最小成本最大利潤的原則,請問要實現對全部村莊的武力控制,夾克老爺需要派出最少多少名家丁?

input

第1行:2個數n, k中間用空格分隔(1<= n <= 100000, 0 <= k <= n)。

之後n-1行:每行2個數s, e中間用空格分隔,表示編號為s的村莊同編號為e的村莊之間有道路相連。(0 <= s, e output

輸出乙個數說明要實現對全部村莊的武力控制,夾克老爺需要派出最少多少名家丁?

input示例

4 1

0 10 2

0 3

output示例

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 了...