bzoj1131:[POI2008]Sta
传送门
考虑根节点的移动,移动到相邻节点对深度和的影响是很显然的
假设从u移动到v
显然有f[v]=f[u]+n-2*size[v]
先定下一个根节点x,求出f[x],然后在dfs一遍进行换根转移就行了
dfs过程中更新答案
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
#define rg register
const int maxn=1e6+10;
int n,pre[maxn*2],nxt[maxn*2],h[maxn],cnt,size[maxn],dep[maxn],mx;
long long ans[maxn],mxx;
void add(int x,int y)
{
pre[++cnt]=y,nxt[cnt]=h[x],h[x]=cnt;
pre[++cnt]=x,nxt[cnt]=h[y],h[y]=cnt;
}
void dfs(int x,int fa)
{
size[x]=1,dep[x]=dep[fa]+1,ans[1]+=dep[x];
for(rg int i=h[x];i;i=nxt[i])
if(pre[i]!=fa)dfs(pre[i],x),size[x]+=size[pre[i]];
}
void get(int x,int fa)
{
if(x!=1)ans[x]=ans[fa]+n-2*size[x];
if(ans[x]>mxx||(ans[x]==mxx&&mx>x))mx=x,mxx=ans[x];
for(rg int i=h[x];i;i=nxt[i])
if(pre[i]!=fa)get(pre[i],x);
}
int main()
{
scanf("%d",&n);
for(rg int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),add(x,y);
dfs(1,0),get(1,0),printf("%d\n",mx);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步