树的重心

点击打开链接

const  int  maxn =  20008 ;
std::vector<int> g[maxn] ;
int   n ;

int   siz[maxn]  , cnt[maxn] ;
int   ans , ansid ;

void  dfs(int u , int father){
      siz[u] = 1  ;
      int s = 0 ;
      for(int i = 0 ; i < g[u].size() ; i++){
           int v = g[u][i] ;
           if(v == father) continue ;
           dfs(v , u) ;
           siz[u] += siz[v]   ;
           s = max(s , siz[v]) ;
      }
      s = max(s , n - siz[u]) ;
      if((s < ans) || (s == ans && ansid > u)){
            ans = s ;
            ansid = u ;
      }
}

int   main(){
      int t , i  , u ,  v ;
      cin>>t  ;
      while(t--){
            scanf("%d" , &n) ;
            for(i = 1 ; i <= n ; i++) g[i].clear()  ;
            for(i = 1 ; i < n ; i++){
                scanf("%d%d" , &u , &v) ;
                g[u].push_back(v) ;
                g[v].push_back(u) ;
            }
            ans =  n ;
            dfs(1 , 0) ;
            printf("%d %d\n" , ansid , ans) ;
      }
      return 0 ;
}



你可能感兴趣的:(树的重心)