黑白樹(牛客網 樹形dp)

2021-09-27 08:03:52 字數 1479 閱讀 2920

題目描述

一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k[i]。每個點都有乙個顏色,初始的時候所有點都是白色的。

你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上(包括節點i與根)所有與節點i距離小於k[i]的點都會變黑,已經是黑的點保持為黑。問最少使用幾次操作能把整棵樹變黑。

輸入描述:

第一行乙個整數n (1 ≤ n ≤ 10^5)

接下來n-1行,每行乙個整數,依次為2號點到n號點父親的編號。

最後一行n個整數為k[i] (1 ≤ k[i] ≤ 10^5)

樣例解釋:

對節點3操作,導致節點2與節點3變黑

對節點4操作,導致節點4變黑

對節點1操作,導致節點1變黑

輸出描述:

乙個數表示最少操作次數

示例1輸入複製4

1211 2 2 1

輸出複製

3我們從每個葉子節點往上回溯。

如果子樹裡面的點染不到這個點就ans++,然後將這個點的染色值傳上去。

如果可以染到這個點,就更新父節點的染色值,然後記錄當前節點染色到的最大值,並且返回。

**如下:

#include

#define ll long long

using

namespace std;

const

int maxx=

1e5+

100;

struct nodee[maxx<<1]

;int tot,head[maxx<<1]

,k[maxx]

,fa[maxx]

,n;/*----------事前準備---------*/

inline

void

init()

inline

void

add(

int u,

int v)

/*---------樹形dp----------*/

inline

intdfs

(int u,

int f,

int&ans)

if(now<=1)

//子樹裡面的點染不到當前的節點

k[f]

=max

(k[f]

,k[u]-1

);//如果能夠染到的話,就更新父親節點的染色值,取最大值

return now-1;

}int

main()

for(

int i=

1;i<=n;i++

)scanf

("%d"

,&k[i]);

int ans=0;

dfs(1,

0,ans)

; cout<}return0;

}

努力加油a啊,(o)/~

牛客網 黑白樹(樹形dp)

一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k i 每個點都有乙個顏色,初始的時候所有點都是白色的。你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上 包括節點i與根 所有與節點i距離小於k i 的點都會...

Nowcoder 黑白樹 樹形dp

一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k i 每個點都有乙個顏色,初始的時候所有點都是白色的。你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上 包括節點i與根 所有與節點i距離小於k i 的點都會...

牛客訓練,殺樹,樹形dp

一道樹形dp題,我剛開始想的是dp i j dp i j dp i j 表示i為根結點最長鏈的長度為j的最小代價,轉移的時候很複雜,最後還是沒寫出來 也有可能是寫炸了,但是這個狀態應該也是可以的 比賽結束後看到題解是用dp i j dp i j dp i j 表示i為根結點最長鏈的長度小於等於j的最...