牛牛染顏色

2021-10-05 18:45:41 字數 1609 閱讀 5677

時間限制:c/c++

1秒,其他語言2秒

空間限制:c/c++

131072k,其他語言262144k

64bit io format:

%lld

牛牛最近得到了一顆樹,根是 1 號節點,他想要把這顆樹染色。

每個節點可以染成白色和黑色,牛牛認為一種染色方案是好的當且僅當任意兩個黑點的 lca(最近公共祖先)的顏色也是黑色的。

求一共有多少種好的染色的方案。

輸入描述:

第一行乙個整數 n,表示這棵樹有 n個節點。 接下來 n-1行,每行兩個整數 u,v 表示 u,v之間有一條邊。

輸出描述:

一行乙個整數,表示所有合法的點的集合數量。

示例1

輸入

412

2324

輸出

14
說明

共計14個集合滿足題意。

注意:空集也算進答案裡面!

示例2輸入

612

1314

2556

輸出

42
備註:

1≤n≤10 6 ,1≤u,v≤n

乙個有n個節點的樹,(其中根節點是1),每個節點可以染色為黑與白,如果有兩個節點都是黑,他們的最近公共祖先也必須是黑,問有多少種塗色方案?

樹形dp問題

我們可以用dp[x][0/1]來表示樹上的節點x已經被染成黑色或者是白色的方案數(黑用1,白用0)

因為題目只對黑色有限制條件,所以如果x為黑色,x的子節點可以是黑色也可以是白色,但是如果x為白色,x的子節點只能是白色,或者是乙個黑色,因為如果有兩個黑色,x作為他倆的最近公共祖先也必須是黑色。

我們在處理時僅考慮染成黑色就行,因為黑色除外的都要染成白色。1是染成黑色,0為白色(也可以理解成不處理)

我們根據上述分析可以列出式子:

dp [x ] [ 0 ]= d p [ x] [ 0 ] + d p[ y ] [ 1 ]+ d p [ y ][ 0 ] - 1

x點不染色的情況是,x的子節點只能是白色,或者是乙個黑色(因為存在空集所以減一)

dp [x ] [ 1 ] = dp[ x] [ 1 ] * dp [y ] [1 ] +dp[ x] [ 1 ] * d p[ y ] [ 0 ]

x染為黑,x的子節點可以是黑色也可以是白色,種類數量相乘

最後推到根節點1

答案就是dp[1][1]+dp[1][0]

void

***(

int x,

int fa)

}printf

("%d"

,(dp[1]

[0]+dp[1]

[1])

%mod)

;

每日一題倒是出現了好幾個樹形dp的題

牛客練習賽62 C 牛牛染顏色(樹形dp)

題意 給出一棵樹,要將樹上的點染成白色或者黑色,有乙個限制條件,任意兩個黑色的點的lca的顏色也必須是黑色,求染色的方案數。題解 設dp i 表示以i為根節點的子樹的至少有乙個黑點的方案數,空集就是dp i 1 1.若點u為黑點,那麼子節點怎麼染色都可以,dp u dp v 1 2.若u為白色的點,...

牛牛的木板 牛牛的字元反轉

原題鏈結 題意 一段長n的序列,由0 1組成。可把m個0改1,求序列中最大連續1的個數。思路 尺取法 雙指標法 設定一對指標l,r。最開始都指向第乙個元素。l,r是區間左右端點,r指標先不斷往右遍歷,當區間內0的個數超過m時,l指標向右遍歷,要跳過乙個0,維持乙個區間內改了m個0的狀態 其間不斷用區...

染陌足跡 SeeConf2019

水文預警!多圖預警!聽了一整天,每位講師的演講都十分精彩,每個主題都能給我從另乙個角度的思考與啟迪,大部分主題都是以未來的互動設計作為維度來展開思考與 以故事或者事例的方式鋪展開來,收穫頗多。由於早上開始的時間市九點,於是起了乙個大早,好久沒那麼早起來過了。帶著滿滿的睏意踩點到了螞蟻z空間。z空間並...