Balancing Act http://poj.org/problem?id=1655
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #define mt(a,b) memset(a,b,sizeof(a)) 6 using namespace std; 7 const int M=50010; 8 vector<int> g[M]; 9 int dp[M],num[M],n; 10 void dfs(int u,int fa){ 11 dp[u]=0; 12 num[u]=1; 13 int len=g[u].size(); 14 for(int i=0;i<len;i++){ 15 int v=g[u][i]; 16 if(v!=fa){ 17 dfs(v,u); 18 num[u]+=num[v]; 19 dp[u]=max(dp[u],num[v]); 20 } 21 } 22 dp[u]=max(dp[u],n-num[u]); 23 } 24 int main(){ 25 int t; 26 while(~scanf("%d",&t)){ 27 while(t--){ 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++) g[i].clear(); 30 for(int i=0,u,v;i<n-1;i++){ 31 scanf("%d%d",&u,&v); 32 g[u].push_back(v); 33 g[v].push_back(u); 34 } 35 dfs(1,-1); 36 int sma=n; 37 for(int i=1;i<=n;i++){ 38 sma=min(sma,dp[i]); 39 } 40 for(int i=1;i<=n;i++){ 41 if(dp[i]==sma){ 42 printf("%d %d\n",i,dp[i]); 43 break; 44 } 45 } 46 } 47 } 48 return 0; 49 }