51Nod 1378 樹形DP 貪心

2021-08-19 02:08:52 字數 2280 閱讀 5037

題目鏈結

題意:給定一棵樹和乙個整數k

kk,可以在樹的任意位置放置乙個人,這個人可以監管距離其所在節點不超過k

kk的所有節點,問最少放置多少個人可以監管整棵樹的所有節點。

思路:此題的解題思路還挺具有啟發意義。

對於樹的相關問題,我們可以考慮先轉換成線性問題來做,如果是線性的話,很顯然最優解應該是從某一端的邊界開始,每個長度為2k2k

2k的區間的中心均放置乙個人,若最後的距離不足2k2k

2k,則也在其中心放置乙個人。

我們可以推廣貪心的思想到樹形結構上:

對於這棵樹,我們可以從葉子節點出發,定義dp[

i]

dp[i]

dp[i]:

若d p[

i]

>

0dp[i]>0

dp[i

]>

0:則代表以i

ii為根節點的子樹可以向上監管距離不超過dp[

i]

dp[i]

dp[i

]的節點

若d p[

i]

<

0dp[i]<0

dp[i

]<

0:則代表以i

ii為根節點的子樹需要其他節點幫助其監管距離為−dp

[i

]-dp[i]

−dp[i]

的節點對於當前考慮的節點i

ii,我們可以求出其子節點dpdp

dp值的最小值mnmn

mn和最大值mxmx

mx,隨後分以下情況討論:

若i

ii為葉子節點,則說明需要其他節點幫助提供監管,更新dp[

i]=−

1dp[i] = -1

dp[i]=

−1。若mn=

=−

kmn == -k

mn==−k

說明存在某乙個以i

ii的子節點為根的子樹,需要其他節點幫助提供k

kk個單位的監管距離,故由i

ii提供,更新dp[

i]=k

dp[i] = k

dp[i]=

k。若m n+

mx−1

>=0

mn + mx - 1 >= 0

mn+mx−

1>=0

則說明有乙個子樹放置的人能夠把其他全部需要監管的村莊都覆蓋,則更新dp[

i]=m

x−

1dp[i] = mx - 1

dp[i]=

mx−1

若以上情況均不滿足,則說明可以繼續向上查詢更優的放置點,更新dp[

i]=m

n−

1dp[i] = mn - 1

dp[i]=

mn−1

故此題得解。

**:

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int inf =

1e8+10;

const

int a =

2e5+10;

class

grag[a<<2]

;int head[a]

,dp[a]

,n,k,tot,ans;

void

add(

int u,

int v)

void

dfs(

int u,

int pre)

if(mn == inf) dp[u]=-

1;else

if(mn <=

-k)else

if(mn + mx >

0) dp[u]

= mx -1;

else dp[u]

= mn -1;

}int

main()

memset

(dp,0,

sizeof

(dp));

ans =0;

dfs(1,

1);if

(dp[1]

<

0) ans++

;printf

("%d\n"

,ans);}

return0;

}

51Nod 1378 夾克老爺的憤怒

1378 夾克老爺的憤怒 夾克老爺逢三抽一之後,由於採用了新師爺的策略,鄉民們叫苦不堪,開始組織起來暴力抗租。夾克老爺很憤怒,他決定派家丁常駐村中進行鎮壓。諾德縣 有n個村莊,編號0 至 n 1,這些村莊之間用n 1條道路連線起來。家丁都是經過系統訓練的暴力機器,每名家丁可以被派駐在乙個村莊,並鎮壓...

51Nod 1378 夾克老爺的憤怒

一棵樹,可以進行染色,被染色的點可以控制與它距離不超過 k 的所有點,問控制整棵樹最少需要染幾個點.貪心.記錄一下最深的未染色點和最淺的染色點,判斷一下能否在子樹中就完成,不能的話就把權值賦成最深未染色點深度 1,能的話就賦成染色點深度 1.需要特判一下根.include include inclu...

codevs1378 選課 樹形DP

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能...