黑白樹(DFS 貪心)

2021-10-17 16:40:14 字數 1968 閱讀 2282

題目傳送門

一棵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

412

11 2 2 1

3
分析:我們先讀懂題目意思,若對某一白節點i進行染色,那麼從節點i到根的鏈上所有與節點i距離小於k[i]的點都會變黑(說明染色方向單獨朝向根),那麼無論如何都必須對樹的所有葉子節點染色,然後再根據每個節點權值k考慮是否對剩下的父節點染色,直到整棵樹的節點全部變為黑節點,並且操作次數最少。

但我們並不需急於先給葉子節點染色,我們可以先從根節點開始深搜每個節點的子節點,記錄每個節點的深度。雖然我們知道每個節點的k值,但由於子節點和父節點處於不同深度,直接比較二者的k值的話不能確定哪個點是最優點。試想,我們可以把根節點看作基準,那麼該點的深度-該點的k值+1就表示這個節點向上染色最多能夠覆蓋到的f深度,f深度越**明該節點覆蓋範圍越大(相對)。這樣的話我們運用貪心策略通過f深度來比較父節點和所有子節點哪個覆蓋範圍更大了。若子節點覆蓋範圍大,則同時更新父節點的f深度(父節點也被子節點塗色了,要繼承子節點的光榮傳統);若子節點能覆蓋父節點,但f深度比父節點小,則父節點的f深度不變;若子節點不能不能覆蓋父節點,則父節點要額外進行一次塗色。最終返回到根節點,整棵樹被塗色完畢。

以下是三種情況:

首先,4,5,6分別為葉子節點,沒有子節點為它染色,故需要自己染色。再看他們的覆蓋範圍,4,5,6節點的深度為4,k值分別為3,2,1,f深度分別為2,3,4,可見在這一層中,4節點的覆蓋範圍最大,能覆蓋到深度2的地方。在上一層節點3 k值為1,f深度為3,沒有子節點4覆蓋範圍大,根據貪心策略被子節點染色並繼承子節點的f深度。

4,5,6節點的深度為4,k值分別為2,2,1,f深度分別為3,3,4,可見在這一層中,4,5節點的覆蓋範圍最大,都能覆蓋到深度3的地方。在上一層節點3 k值為1,f深度為3,也能被子節點覆蓋,根據貪心策略被子節點染色並繼承子節點的f深度

4,5,6節點的深度為4,k值分別為1,1,1,f深度分別為3,3,3,可見在這一層中,4,5,6節點的覆蓋範圍一樣,只能覆蓋到深度3的地方。在上一層節點3 k值為1,f深度為2,子節點不能覆蓋父節點,根據貪心策略這時父節點要進行染色

#include#include#includeusing namespace std;

const int m = 1e5+5;

const int inf = 0x3f3f3f;

int n,f[m],p[m],k[m],deep[m],t,ans;

vectore[m];

void dfs(int x)

}int main()

for(int i=1;i<=n;i++)

deep[1] = 1;

dfs(1);

printf("%d\n",ans);}/*

4121

1 2 2 1

*/

黑白樹 樹形 貪心

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

NC13249 黑白樹 樹上貪心

一棵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 的點都會...