高數題 (樹形DP?)

2021-08-28 16:28:49 字數 3054 閱讀 6614

【問題描述】

π姐最近生了個漂亮寶寶休假在家,聽lee姐介紹經驗時發覺lee姐比高中反應遲鈍了些,一問才知lee姐是因為連生了兩兒子才這樣的,lee姐的體會是一孕笨三年,π姐聽了覺得閒著也是閒著,得找些挑戰的事情做做,於是π姐最近開始刷起了高數題,她遇到了這樣一道高數題。這道高數題裡面有一棵n個點的樹,樹上每個點有點權,每條邊有顏色。一條路徑的權值是這條路徑上所有點的點權和,一條合法的路徑需要滿足該路徑上任意相鄰的兩條邊顏色都不相同。問這棵樹上所有合法路徑的權值和是多少啊?(無向路徑)

【輸入格式】

第一行乙個整數n,代表樹上有多少個點。

接下來一行n個整數,代表樹上每個點的權值。

接下來n-1行,每行三個整數s、e、c,代表s與e之間有一條顏色為c的邊。

【輸出格式】

一行乙個整數,代表所求的值。

【輸入樣例】

66 2 3 7 1 4

1 2 1

1 3 2

1 4 3

2 5 1

2 6 2

【輸出樣例】

134【樣例解釋】

1-2 value: 8

1-3 value: 9

1-4 value:13

1-2-6 value:12

2-1-3 value:11

2-1-4 value:15

2-5 value:3

2-6 value:6

3-1-4 value:16

3-1-2-6 value:15

4-1-2-6 value:19

5-2-6 value:7

【資料規模】

對與30%的資料,1≤n≤1000。

對於另外20%的資料,可用的顏色數不超過109且隨機資料。

對於另外20%的資料,樹的形態為一條鏈。

對於100%的資料,1≤n≤3*105,可用的顏色數不超過109,所有點權的大小不超過105。

題解:這道題看上去很簡單它也的確很簡單

記錄乙個sum陣列

p a[

i]表示

以i為終

點的路徑

總數

pa[i]表示以i為終點的路徑總數

pa[i]表

示以i為

終點的路

徑總數sum

[i]表

示以i為

終點的所

有路徑的

權值

和sum[i]表示以i為終點的所有路徑的權值和

sum[i]

表示以i

為終點的

所有路徑

的權值和

(從葉子往跟做,前提是相鄰的邊的顏色要不一樣)

這個是處理能往上走的路徑方案

然後不能往上走的也就是說以這個節點為中轉站的

就是這個節點所有子節點

p a[

i]∗s

um[j

]+pa

[j]∗

sum[

i]+p

a[i]

∗pa[

j]∗w

[x

]pa[i]*sum[j]+pa[j]*sum[i]+pa[i]*pa[j]*w[x]

pa[i]∗

sum[

j]+p

a[j]

∗sum

[i]+

pa[i

]∗pa

[j]∗

w[x]

i ,j

,x

i,j,x

i,j,

x分別表示這個節點的任意兩個子節點以及該子節點

因為每條新路徑他們都要加一次,所以如上公式

結束!

#include

using

namespace std;

const

int maxm=

300010

;long

long ans=0;

struct node

e[maxm<<1]

;long

long cnt,head[maxm]

,w[maxm]

,pa[maxm]

,n;long

long sum[maxm]

,sump[maxm]

;void

add(

int u,

int v,

int color)

void

dfs(

int x,

int fa,

int fr)

else ans+

=sum[y]

+w[x]

*pa[y];}

for(

int i=head[x]

; i; i=e[i]

.nxt)

for(

int j=e[i]

.nxt; j; j=e[j]

.nxt)

if(i!=j&&e[i]

.color!=e[j]

.color&&e[i]

.v!=fa&&e[j]

.v!=fa)

ans-

=w[x]

; sum[x]

+=w[x]

; pa[x]++;

}int

main()

dfs(1,

1,-1

);for(

int i=

1; i<=n; i++

) ans+

=sum[i]

;printf

("%lld"

,ans)

;}

注意一些細節,long long之類的

初測0,原因是第二個公式的有乙個j

jj打成了i

ii,然後還過了樣例沒發現,還有是記錄父親連線爺爺的邊的顏色

e [i

].co

lo

re[i].color

e[i].c

olor

打成了i

ii,居然夠了樣例,然後時間沒來的及造資料

難過qwq

樹形DP 高階題

emmmm我之前那篇部落格都是一些普及提高的樹形dp水題,基本都是乙個模板能夠解決的問題。現在讓我們來高階一下。傳送門 有乙個樹形結構,每條邊的長度相同,任意兩個節點可以相互到達。選3個點。兩兩距離相等。有多少種方案?難度 省選 noi 這道題的難度並不是不能接受,一開始會覺得很難但是仔細想過之後會...

樹形dp 沒有上司的舞會 模板題 樹形dp

樹形dp思維門檻高,但是跨過門檻之後,思維難度卻不高。這點非常類似於 關鍵是要體會採用二進位制數來表示狀態的思想,要轉變傳統思維,學習接收並吸收這種思想。285.沒有上司的舞會 簡單模擬樣例,便於理解 樣例的高興度都是 1,那就是挑選沒有相鄰邊的盡量多的點 樹形dp思路 重點 狀壓dp 思路 狀態轉...

樹形DP 樹形DP四例

是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...