題意:
給定一棵樹,一開始點都是白色的,每次你可以對乙個點染色,獲得的分數就是當前點連線的只含白色的點的連通塊的點個數。輸出最多的分數。
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...