#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <set> #include <vector> #include <map> #include <queue> #include <set> #include <algorithm> #include <limits> using namespace std; typedef long long LL; const int MAXN=200000+1000; const int INF = numeric_limits<int>::max(); const LL LL_INF= numeric_limits<LL>::max(); struct Edge { int to,next; Edge(){} Edge(int _to,int _next):to(_to),next(_next){} }e[MAXN*2]; int head[MAXN],tot; void init(){ memset(head,-1,sizeof(head)); tot=0; } void AddEdge(int u,int v){ e[tot]=Edge(v,head[u]); head[u]=tot++; e[tot]=Edge(u,head[v]); head[v]=tot++; } int dis[MAXN],vis[MAXN],pre[MAXN],du[MAXN]; int mainpath[MAXN]; void bfs(int x,int flag,int y){ memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); memset(du,0,sizeof(du)); queue <int> q; q.push(x); vis[x]=1; dis[x]=1; pre[x]=x; while(!q.empty()){ int now=q.front(); q.pop(); for(int i=head[now];~i;i=e[i].next){ int next=e[i].to; if(flag&&next==y)continue; if(vis[next])continue; du[now]++;du[next]++; vis[next]=1; dis[next]=dis[now]+1; pre[next]=now; q.push(next); } } } int vis2[MAXN]; void bfs1(int x){ memset(vis2,0,sizeof(vis2)); memset(dis,0,sizeof(dis)); dis[x]=1; queue <int> q; q.push(x); vis2[x]=1; pre[x]=x; while(!q.empty()){ int now=q.front(); q.pop(); for(int i=head[now];~i;i=e[i].next){ int next=e[i].to; if(vis[next]&&!vis2[next]){ vis2[next]=1; dis[next]=dis[now]+1; pre[next]=now; q.push(next); } } } } int hpath[MAXN]; void getmainpath(int x){ memset(hpath,0,sizeof(hpath)); mainpath[0]=0; while(pre[x]!=x){ mainpath[++mainpath[0]]=x; hpath[x]=1; x=pre[x]; } mainpath[++mainpath[0]]=x; hpath[x]=1; } int main() { int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); init(); for(int i=0,x,y;i<n-1;i++){ scanf("%d%d",&x,&y); AddEdge(x,y); }
int maxdis=0,maxu; bfs(1,0,0); int tu=1; for(int i=1;i<=n;i++){ if(du[i]==1){ tu=i;break; } } bfs1(tu); maxdis=0; for(int i=1;i<=n;i++){ if(maxdis<dis[i]){ maxu=i;maxdis=dis[i]; } } bfs1(maxu); maxdis=0; for(int i=1;i<=n;i++){ if(maxdis<dis[i]){ maxu=i;maxdis=dis[i]; } }
getmainpath(maxu); int ans1,ans2; int dis1,dis2; if(maxdis%2==0){ int mid=maxdis/2; int midl=mid; int midr=midl+1; int midu,midv; for(int i=1;i<=mainpath[0];i++){ if(dis[mainpath[i]]==midl){ midu=mainpath[i]; } if(dis[mainpath[i]]==midr){ midv=mainpath[i]; } } while(midu==midv); bfs(midu,1,midv); int tu=midu; for(int i=1;i<=n;i++){ if(vis[i]&&du[i]==1){ tu=i;break; } } bfs1(tu); maxdis=0; for(int i=1;i<=n;i++){ if(dis[i]>maxdis){ maxdis=dis[i];maxu=i; } } bfs1(maxu); maxdis=0; for(int i=1;i<=n;i++){ if(dis[i]>maxdis){ maxdis=dis[i];maxu=i; } } getmainpath(maxu); for(int i=1;i<=mainpath[0];i++){ if(dis[mainpath[i]]==maxdis/2+1){ ans1=mainpath[i]; } } dis1=maxdis/2;
bfs(midv,1,midu); tu=midv; for(int i=1;i<=n;i++){ if(vis[i]&&du[i]==1){ tu=i;break; } } bfs1(tu); maxdis=0; for(int i=1;i<=n;i++){ if(dis[i]>maxdis){ maxdis=dis[i];maxu=i; } } bfs1(maxu); maxdis=0; for(int i=1;i<=n;i++){ if(dis[i]>maxdis){ maxdis=dis[i];maxu=i; } } getmainpath(maxu); for(int i=1;i<=mainpath[0];i++){ if(dis[mainpath[i]]==maxdis/2+1){ ans2=mainpath[i]; } } dis2=maxdis/2; printf("%d %d %d\n",max(dis1,dis2),ans1,ans2); } else { int mid=maxdis/2+1; int midu,midv; for(int i=1;i<=mainpath[0];i++){ if(dis[mainpath[i]]==mid){ midu=mainpath[i]; } } midv=midu; for(int i=head[midu];~i;i=e[i].next){ if(hpath[e[i].to]){ midv=e[i].to;break; } } while(midu==midv); bfs(midu,1,midv); int tu=midu; for(int i=1;i<=n;i++){ if(vis[i]&&du[i]==1){ tu=i;break; } } bfs1(tu); maxdis=0; for(int i=1;i<=n;i++){ if(maxdis<dis[i]){ maxdis=dis[i]; maxu=i; } } bfs1(maxu); maxdis=0; for(int i=1;i<=n;i++){ if(maxdis<dis[i]){ maxdis=dis[i]; maxu=i; } } getmainpath(maxu); for(int i=1;i<=mainpath[0];i++){ if(dis[mainpath[i]]==maxdis/2+1){ ans1=mainpath[i]; } } dis1=maxdis/2;
bfs(midv,1,midu); tu=midv; for(int i=1;i<=n;i++){ if(vis[i]&&du[i]==1){ tu=i;break; } } bfs1(tu); maxdis=0; for(int i=1;i<=n;i++){ if(maxdis<dis[i]){ maxdis=dis[i]; maxu=i; } } bfs1(maxu); maxdis=0; for(int i=1;i<=n;i++){ if(maxdis<dis[i]){ maxdis=dis[i]; maxu=i; } } getmainpath(maxu); for(int i=1;i<=mainpath[0];i++){ if(dis[mainpath[i]]==maxdis/2+1){ ans2=mainpath[i]; } } dis2=maxdis/2; printf("%d %d %d\n",max(dis1,dis2),ans1,ans2); } } return 0; }
|