bzoj1131 Sta
给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大
n<=1000000
发现当根从某个位置移到它的一个子树时只要O1的时间就可以果断得出ans
所以大概就一个dfs完事
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdlib> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #define ll long long const int MAXN=1000010; using namespace std; int n,a,b; int first[2*MAXN],to[2*MAXN],next[2*MAXN],cnt; inline void add(int u,int v) { to[++cnt]=v; next[cnt]=first[u]; first[u]=cnt; to[++cnt]=u; next[cnt]=first[v]; first[v]=cnt; } int rank[MAXN],size[MAXN]; ll dp[MAXN]; void rank_dfs(int x,int fa) { size[x]=1; dp[x]=rank[x]; for(int i=first[x];i;i=next[i]) { if(to[i]==fa)continue; rank[x]=rank[to[i]]+1; rank_dfs(to[i],x); size[x]+=size[to[i]]; } } void dfs(int x,int fa) { for(int i=first[x];i;i=next[i]) { if(to[i]==fa)continue; dp[to[i]]=dp[x]+n-2*size[to[i]]; dfs(to[i],x); } } int main() { scanf("%d",&n); for(int i=1;i<n;i++){scanf("%d%d",&a,&b);add(a,b);} rank_dfs(1,0); dfs(1,0); int ans=1; for(int i=1;i<=n;i++) if(dp[i]>dp[ans])ans=i; cout<<ans; return 0; }