和刚才那个一样的题.. 改一下就过了
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 50005;
int node [MAXN];
int ans[MAXN];
int head[MAXN];
int sum, n;
int edge[MAXN*2];
int next[MAXN*2];
int vis[MAXN];
void addedge ( int a , int b )
{
int temp = head[a];
head[a] = sum;
edge[sum] = b;
next[sum] = temp;
sum ++;
temp = head[b];
head[b] = sum;
edge[sum] = a;
next[sum] = temp;
sum ++;
}
int dfs ( int u )
{
int num = 1;
vis[u] = 1;
for ( int i = head[u] ; i != -1; i = next[i] )
{
int v = edge[i];
//cout << "***** " << v << endl;
if ( !vis[v] )
{
num += dfs( v );
}
}
return node[u] = num;
}
void find_ans ( int u )
{
ans[u] = n - node[u];
vis[u] = 1;
for ( int i = head[u] ; i != -1 ; i = next[i] )
{
int v = edge[i];
if ( !vis[v] )
{
ans[u] = max ( node[v] , ans[u] );
find_ans ( v );
}
}
}
int main()
{
int T;
scanf("%d" ,&T);
while ( T-- )
{
scanf("%d" , &n ) ;
sum =0;
memset ( ans , 0 , (n+1)*sizeof ( int ));
memset ( node , 0 , (n+1)*sizeof ( int ));
memset ( vis , 0 , (n+1)*sizeof ( int ));
memset ( head , -1 , (n+1)*sizeof ( int ));
for ( int i = 0 ; i < n-1; i ++ )
{
int a , b;
scanf("%d%d", &a , &b );
addedge( a , b );
}
//cout << "here" << endl;
dfs ( 1 );
//cout << "here" << endl;
memset ( vis , 0 , (n+1)*sizeof ( int ));
find_ans ( 1 );
//cout << "here" << endl;
int w = 99999999;
for ( int i = 1 ; i <= n ; i ++ )
{
if ( w > ans[i] )
w = ans[i];
}
int flag = 1;
for ( int i = 1; i <= n ; i ++ )
if ( w == ans[i] && flag )
{
printf("%d %d", i,w );
break;
}
printf("\n");
}
return 0;
}