題目鏈結
題意:給定一棵樹和乙個整數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門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能...