记录下当前节点的儿子个数,再记下以当前节点为跟的所有子节点的深度之和。val[I]表示以i为根的所有深度和。
val[now]=val[last]-f[now]+n-f[now];
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long sint;
#define maxn 2100000
int getint()
{
char c;
int res;
while(c=getchar(),c<'0'||c>'9');
res=c-'0';
while(c=getchar(),c>='0'&&c<='9')
res=res*10+c-'0';
return res;
}
int n,num;
int next[maxn],first[maxn],f[maxn],to[maxn];
sint val[maxn],f2[maxn];
void add(int a,int b)
{
num++;
to[num]=b;
next[num]=first[a];
first[a]=num;
}
void dfs(int last,int now)
{
f[now]=1;
int v;
for(int i=first[now];i;i=next[i])
{
v=to[i];
if(v==last) continue;
dfs(now,v);
f[now]+=f[v];
f2[now]+=f2[v];
}
f2[now]+=f[now];
}
void dfs2(int last,int now)
{
if(last==0)
{
val[now]=f2[now];
}
else
{
val[now]=val[last]-f[now]+n-f[now];
}
int v;
for(int i=first[now];i;i=next[i])
{
v=to[i];
if(v==last) continue;
dfs2(now,v);
}
}
int main()
{
int u,v;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
u=getint();
v=getint();
add(u,v);
add(v,u);
}
dfs(0,1);
dfs2(0,1);
sint maxl=0;
for(int i=1;i<=n;i++)
{
if(val[i]>maxl)
{
maxl=val[i];
u=i;
}
}
printf("%d\n",u);
return 0;
}

本文介绍了一种基于树形结构的深度优先搜索算法——树形DP。通过递归计算节点的深度之和来解决特定问题。该算法首先进行一次DFS预处理节点的子节点数量及子树深度,随后再次DFS计算每个节点的深度总和。
662

被折叠的 条评论
为什么被折叠?



