P3478 [POI2008] STA-Station

 

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=1e6+10;

ll siz[maxn],dep[maxn],f[maxn];
int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;
int n;
ll ans1,ans2;

void add(int u,int v){
    to[++tot]=v;nxt[tot]=head[u];head[u]=tot;
}
void dfs1(int x,int faa)
{
    dep[x]=dep[faa]+1;siz[x]=1;
    for(int i=head[x];i;i=nxt[i])
    {
        int v=to[i]; if(v==faa) continue;
        dfs1(v,x);
        siz[x]+=siz[v];
    }
}
void dfs2(int x,int faa)
{
//    ddd
    for(int i=head[x];i;i=nxt[i])
    {
        int v=to[i]; if(v==faa) continue;
        f[v]=f[x]-2*siz[v]+n;
    //    cout<<v<<"->"<<f[v]<<endl;
        dfs2(v,x);
    }
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n;
    for(int i=1;i<=n-1;i++){
        int u,v;cin>>u>>v;
        add(u,v);add(v,u);
    }
    dfs1(1,1);
    for(int i=1;i<=n;i++) f[1]+=dep[i];//cout<<i<<"->"<<siz[i]<<endl;; 
    //cout<<f[1]<<endl;
    
    dfs2(1,1);
    
    for(int i=1;i<=n;i++){
    //    cout<<i<<"->"<<f[i]<<endl;
        
        if(f[i]>ans1) ans2=i,ans1=f[i];
    }
    cout<<ans2<<'\n';
    
    return 0;
}
View Code

 

 
posted @ 2023-08-13 08:55  JMXZ  阅读(8)  评论(0)    收藏  举报