E. Tree Painting(树形换根dp)

时间:2023-03-10 03:46:11
E. Tree Painting(树形换根dp)

http://codeforces.com/contest/1187/problem/E

分析:问得分最高,实际上就是问以哪个节点出发得到的分数最多,而呈现成代码形式就变成了换根,max其得分!!!而要利用之前算过的得分来求。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=2e5+;
vector<int>e[M];
int son[M];
ll ans;
int n;
void dfs(int u,int f){
son[u]=;
for(int i=;i<e[u].size();i++){
int v=e[u][i];
if(v==f)
continue;
dfs(v,u);
son[u]+=son[v];
}
ans+=son[u];
}
void DFS(int u,int f,ll now){
ans=max(ans,now);
for(int i=;i<e[u].size();i++){
int v=e[u][i];
if(v==f)
continue;
DFS(v,u,now+n-*son[v]);
}
}
int main(){ scanf("%d",&n);
for(int i=;i<n;i++){ int u,v;
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
ans=;
dfs(,-);
DFS(,-,ans);
printf("%I64d\n",ans); }