因为建立的树实际上主要是记录点的无向图G,dfs(u,r)的r是用来防止遍历子节点时dfs到父节点,还用到了记忆化,并且是在一次dfs时求答案,效率有点低,AC用时300ms
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
#define DEBUG
const int maxn=20000+5,maxv=26,INF=0x3f3f3f3f;
int n,d[maxn],ans,node,visited[maxn];
vector<int> vt[maxn];
void dfs(int u,int r){
if(visited[u])return;
d[u]=1;
int temp=0;
visited[u]=1;
for(int i=0;i<vt[u].size();i++){
int t=vt[u][i];
if(r==t)continue;
dfs(t,u);
d[u]+=d[t];
if(temp<d[t])temp=d[t];
}
if(temp<n-d[u]){
temp=n-d[u];
}
if(temp<ans){
ans=temp;
node=u;
}
else if(temp==ans&&u<node){
node=u;
}
}
int main(){
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int t;
cin>>t;
while(t--){
memset(visited,0,sizeof(visited));
for(int i=0;i<n;i++)vt[i].clear();
ans=INF;
cin>>n;
int u,v;
for(int i=0;i<n-1;i++){
cin>>u>>v;
vt[u-1].push_back(v-1);
vt[v-1].push_back(u-1);
}
dfs(0,-1);
printf("%d %d\n",node+1,ans);
}
#ifdef DEBUG
fclose(stdin);
fclose(stdout);
#endif
return 0;
}