https://codeforces.com/contest/1187/problem/E
题意:求一棵树以哪个为根节点可使得Σ每个节点的儿子数 最大。
思路:当根节点是1是,贡献是x,如果此时根节点变成2,那么相当于新的贡献为 x - 绿色的节点个数 - 橙色的节点个数,即x - 2*②的子树节点个数。那么只需要dfs统计一下son[],然后dfs遍历算一下贡献取最大值。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define FI first
#define SE second
#define MP make_pair
#define PII pair<int,int>
const LL mod =1e9+7;
const int MX = 2e5+5;
vector<int>g[MX];
int son[MX];
LL ans=0;int n;
void getSon(int v,int fa){
son[v]=1;
for(auto i:g[v]){
if(i==fa)continue;
getSon(i,v);son[v]+=son[i];
}
ans+=(LL)son[v];
}
void getAns(int v,int fa,LL now){
ans=max(ans,now);
for(auto i:g[v]){
if(i==fa)continue;
getAns(i,v,now+(LL)(n-2*son[i]));
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int uu,vv;scanf("%d%d",&uu,&vv);
g[uu].push_back(vv);g[vv].push_back(uu);
}
getSon(1,0);
getAns(1,0,ans);
cout<<ans;
return 0;
}