E Tree Painting 樹形dp 換根

2021-10-04 09:46:04 字數 1142 閱讀 7935

題意:

給定一棵樹,一開始點都是白色的,每次你可以對乙個點染色,獲得的分數就是當前點連線的只含白色的點的連通塊的點個數。輸出最多的分數。

2 ≤n

≤2⋅1

05

2≤n≤2⋅10^5

2≤n≤2⋅

105分析:

每次對乙個點進行操作就將樹分成了m棵子樹,並且我們肯定是先操作父節點,再操作子節點,所以自然就想到了樹形dp。但是根我們是不知道的,所以就要進行換根。

樹形dp,dp[i]表示以i為根的子樹進行操作獲得的最大值,dp[i]=dp[t]+son[i] (t為i的子節點,son[i]為i的兒孫節點數)。換根的轉移為dp[t] = dp[i] - son[t] + son[i] - son[t],當前父節點的分數要減去現在為根的這個節點原先的兒孫節點數,再加上原先的父節點現在對t的貢獻。注意這時候已經換根了,我們需要改變son[t]的值,回溯時再變回來。

#include

#include

using

namespace std;

typedef

long

long ll;

int son[

200005];

ll dp[

200005];

vector<

int> g[

200005];

void

dfs1

(int x,

int fa)

for(

int i =

0; i < g[x]

.size()

; i++

) son[x]++;

dp[x]

+= son[x];}

void

dfs2

(int x,

int fa)

}int

main()

dfs1(1

,0);

dfs2(1

,0);

ll ans =0;

for(

int i =

1; i <= n; i++

) cout << ans <<

'\n'

;return0;

}

E Tree Painting(樹形換根dp)

分析 問得分最高,實際上就是問以哪個節點出發得到的分數最多,而呈現成 形式就變成了換根,max其得分!而要利用之前算過的得分來求。includeusing namespace std typedef long long ll const int m 2e5 5 vector e m intson m...

樹形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...

樹形操作1 樹形拖拽選擇

樹形運算元據,做個整理總結。本篇是關於樹節點拖拽選擇,重新生成一棵新樹,並支援刪除節點。demo 是基於 jquery 及 easy ui 庫實現的。截圖 利用 css3 實現。主要運用了 before,after選擇器 畫 了兩個圓,然後利用border進行圓的調整,最後利用animation及t...