1. 程式人生 > >bzoj1131 Sta

bzoj1131 Sta

isp algo src none tin using clas close include

給出一個N個點的樹,找出一個點來,以這個點為根的樹時,所有點的深度之和最大

n<=1000000

發現當根從某個位置移到它的一個子樹時只要O1的時間就可以果斷得出ans

所以大概就一個dfs完事

技術分享
#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; }
View Code

bzoj1131 Sta