bzoj1131 Sta
阿新 • • 發佈:2017-10-23
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;View Codeint 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; }
bzoj1131 Sta