You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# include <bits/stdc++.h>
using namespace std ;
const int N = 1e5 + 10 ;
# define int long long
# define endl "\n"
vector < int > g [ N ] ; // 邻接表,存图
int sz [ N ] ; // sz[i]:以i为根的子树中节点个数
int son [ N ] ; // son[i]:去掉节点i后, 剩下的连通分量中最大子树节点个数
int r1 , r2 , n ;
void dfs ( int u , int fa ) {
sz [ u ] = 1 ; // u为根的子树中, 最起码有一个节点u
son [ u ] = 0 ; // 把节点u去掉后, 剩下的连通分量中最大子树节点个数现在还不知道, 预求最大, 先设最小
for ( int i = 0 ; i < g [ u ] . size ( ) ; i + + ) { // 枚举u的每一条出边
int v = g [ u ] [ i ] ;
if ( v = = fa ) continue ;
dfs ( v , u ) ;
sz [ u ] + = sz [ v ] ;
son [ u ] = max ( son [ u ] , sz [ v ] ) ;
}
son [ u ] = max ( son [ u ] , n - sz [ u ] ) ;
if ( ( son [ u ] < < 1 ) < = n ) r2 = r1 , r1 = u ;
}
signed main ( ) {
int T ;
cin > > T ;
while ( T - - ) {
cin > > n ;
// 多组测试数据,清空
memset ( sz , 0 , sizeof sz ) ;
memset ( son , 0 , sizeof son ) ;
r1 = r2 = 0 ;
for ( int i = 0 ; i < = n + 10 ; i + + ) g [ i ] . clear ( ) ;
for ( int i = 1 ; i < n ; i + + ) { // n-1条边
int x , y ;
cin > > x > > y ;
g [ x ] . push_back ( y ) ;
g [ y ] . push_back ( x ) ;
}
dfs ( 1 , 0 ) ; // 以1号点为入口, 它的父节点是0
if ( ! r2 ) {
int r3 = g [ r1 ] [ 0 ] ;
cout < < r1 < < " " < < r3 < < endl ;
cout < < r1 < < " " < < r3 < < endl ;
} else {
int r3 = r1 ;
for ( int i = 0 ; i < g [ r2 ] . size ( ) ; i + + ) {
r3 = g [ r2 ] [ i ] ;
if ( r3 ! = r1 ) break ;
}
cout < < r3 < < " " < < r2 < < endl ;
cout < < r3 < < " " < < r1 < < endl ;
}
}
return 0 ;
}