传送门
题意:
思路:
可以发现对于一个结点x和他的儿子y
以x为根换成以y为根时,以v为根的子树上的所有结点的深度都减小1,其他结点的深度都增加1
dp[y]=dp[x]+siz[y]+(n-siz[y])
代码:
#include <bits/stdc++.h>
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define debug(x) cout<<x<<endl
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const int MAXN=1e6+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
//::iterator it;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
int n;
vector<int>p[MAXN];
int siz[MAXN];
ll dp[MAXN];
int dep[MAXN];
void dfs(int x,int fa){
dep[x]=dep[fa]+1;
siz[x]=1;
for(auto y:p[x]){
if(y==fa)continue;
dfs(y,x);
siz[x]+=siz[y];
}
}
void dfs2(int x,int fa){
for(auto y:p[x]){
if(y==fa)continue;
dp[y]=dp[x]-siz[y]+(n-siz[y]);
dfs2(y,x);
}
}
int main()
{
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
p[u].pb(v);
p[v].pb(u);
}
dfs(1,0);
ll ans=0;
for(int i=1;i<=n;i++)ans+=dep[i];
int st=1;
dp[1]=ans;
dfs2(1,0);
for(int i=1;i<=n;i++){
if(dp[i]>ans){
ans=dp[i];
st=i;
}
}
cout<<st<<endl;
return 0;
}
/*
*/