題目描述:solution:根據題目描述,我們很容易想到從葉子節點x 以 k[x] 的距離往上覆蓋,當k[x] 為0時,染色數就++,但這時候選擇哪個節點再進行染色是最優的呢?是當前恰好不能被 x 覆蓋的當前節點,還是已經被 x 覆蓋的結點中 k[i] (動態維護) 最大的乙個和當前結點的 k 相比中較大的乙個?所以當然是後者,但是你會有疑問,那已經被覆蓋了的點不是不能再被染色了嗎?注意這時候只是選擇要染的點,而不是按照這個順序染,當要染的點都挑選完畢,你可以從根往下染嘛。是吧~一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k[i]。每個點都有乙個顏色,初始的時候所有點都是白色的。你需要通過一系列操作使得最終每個點變成黑色。每次操作需要選擇乙個節點i,i必須是白色的,然後i到根的鏈上(包括節點i與根)所有與節點i距離小於k[i]的點都會變黑,已經是黑的點保持為黑。問最少使用幾次操作能把整棵樹變黑。
#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 的點都會...