黑白樹 樹形 貪心

2021-10-04 20:17:03 字數 1141 閱讀 5188

題目描述:

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

solution:根據題目描述,我們很容易想到從葉子節點x 以 k[x] 的距離往上覆蓋,當k[x] 為0時,染色數就++,但這時候選擇哪個節點再進行染色是最優的呢?是當前恰好不能被 x 覆蓋的當前節點,還是已經被 x 覆蓋的結點中 k[i] (動態維護) 最大的乙個和當前結點的 k 相比中較大的乙個?所以當然是後者,但是你會有疑問,那已經被覆蓋了的點不是不能再被染色了嗎?注意這時候只是選擇要染的點,而不是按照這個順序染,當要染的點都挑選完畢,你可以從根往下染嘛。是吧~

#include

#include

using

namespace std;

const

int n =

1e5+7;

int h[n]

,e[n*2]

,ne[n*2]

,idx;

int k[n]

,ans;

void

add(

int a,

int b)

intdfs

(int u,

int fa)

if(num==0)

k[fa]

=max

(k[fa]

,k[u]-1

);//維護每個結點能往上覆蓋的最大距離

return num-1;

}int

main()

for(

int i=

1;i<=n;i++

) cin>>k[i]

;dfs(1

,0);

cout

}

黑白樹(DFS 貪心)

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

Nowcoder 黑白樹 樹形dp

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

美團CodeM初賽B輪 黑白樹 樹形結構貪心

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