Problem: 2063C - Remove Exactly Two
Language: c++17 

Solution 1 (runtime: 859 ms):
// #include<bits/stdc++.h>
// using namespace std;
// #define ll long long
// #define fr(i, j, n) for(ll i = j; i <n; i++)
// #define pb push_back
// #define up upper_bound
// #define lb lower_bound
// #define all(v) v.begin(), v.end()
// #define rall(v) v.rbegin(), v.rend()
// #define srt(v) sort(all(v))
// #define rsrt(v) sort(rall(v))
// typedef vector<int>vi;
// typedef vector<vector<int>>vvi;
// typedef vector<long long>vll;
// typedef vector<vector<long long>>vvll;

// const int MOD = 1e9 + 7;
// const int INF = 1e9;
// const ll LINF = 1e18;



// ll getFirstBit(ll n){
//      return 63 - __builtin_clzll(n);
// }

// ll countBits(ll n){
//      return __builtin_popcountll(n);
// }
// ll binpow(ll a,ll b, ll m)
// {
//     if(b==0)
//         {
//             return 1;
//         }
//     if(b%2)
//         {
//             return (a*binpow(a,b-1, m))%m;
//         }
//     return binpow((a*a)%m,b/2, m);
// }
// void vInp(auto & v){
//     for(auto & it : v)cin>>it;
// }


// ll modMul(ll x, ll y){
//     return x * 1LL * y % MOD;
// }

// ll modInv(ll x){
//     return binpow(x , MOD -2, MOD);
// }

// ll modDivide(ll x, ll y){
//     return modMul(x, modInv(y));
// }

// void vvInp(auto & v){
//     for(auto & it : v){
//         for(auto & it2 : it)cin>>it2;
//     }
// }


// int solve(){
//     int n;
//     cin>>n;
//     vector<vector<int>>adj(n);
//     for(int i=0;i<n-1;i++){
//         int u,v;
//         cin>>u>>v;
//         u--,v--;
//         adj[u].pb(v);
//         adj[v].pb(u);
//     }
   
//     int ans=0;
//     for(int i=0;i<n;i++){
//         for(auto j:adj[i]){
//             ans=max(ans,(int)(adj[i].size()+adj[j].size()-2));
//         }
//     }
    
//     multiset<int>st;
//     for(int i=0;i<n;i++)st.insert(adj[i].size());
//     for(int i=0;i<n;i++){
//         st.erase(st.find(adj[i].size()));
//         for(auto it:adj[i]){
//             st.erase(adj[it].size());
//         }
//         ans=max(ans,(int)(adj[i].size()+*st.rbegin()-1));
//         st.insert(adj[i].size());
//         for(auto j:adj[i]){
//             st.insert(adj[j].size());
//         }
//     }
//     cout<<"je"<<endl;
//     return ans;
// }


// int main(){
// int t;
// cin>>t;
// while(t--){
//     cout<<solve()<<endl;
// }
//      return 0;
// }
    
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fr(i, j, n) for(ll i = j; i <n; i++)
#define pb push_back
#define up upper_bound
#define lb lower_bound
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define srt(v) sort(all(v))
#define rsrt(v) sort(rall(v))
typedef vector<int>vi;
typedef vector<vector<int>>vvi;
typedef vector<long long>vll;
typedef vector<vector<long long>>vvll;

const int MOD = 1e9 + 7;
const int INF = 1e9;
const ll LINF = 1e18;



ll getFirstBit(ll n){
     return 63 - __builtin_clzll(n);
}

ll countBits(ll n){
     return __builtin_popcountll(n);
}
ll binpow(ll a,ll b, ll m)
{
    if(b==0)
        {
            return 1;
        }
    if(b%2)
        {
            return (a*binpow(a,b-1, m))%m;
        }
    return binpow((a*a)%m,b/2, m);
}
void vInp(auto & v){
    for(auto & it : v)cin>>it;
}


ll modMul(ll x, ll y){
    return x * 1LL * y % MOD;
}

ll modInv(ll x){
    return binpow(x , MOD -2, MOD);
}

ll modDivide(ll x, ll y){
    return modMul(x, modInv(y));
}

void vvInp(auto & v){
    for(auto & it : v){
        for(auto & it2 : it)cin>>it2;
    }
}


void solve(){
    int n;
    cin>>n;
    vvi adj(n);
    fr(i, 0, n-1){
        int a, b;
        cin>>a>>b;
        a--, b--;
        adj[a].pb(b);
        adj[b].pb(a);
    }

    int ans =0;
    fr(i, 0, n){
        for(auto j : adj[i]){
            ans = max(ans, (int)adj[i].size() + (int)adj[j].size() -2);
        }
    }

    multiset<int>st;
    for(int i = 0; i < n; i++)st.insert(adj[i].size());

    for(int i = 0; i < n;i++){
        st.erase(st.find(adj[i].size()));

        for(auto j : adj[i]){
            st.erase(st.find(adj[j].size()));
        }

        if(!st.empty()){
            ans =max(ans, (int)adj[i].size() + *st.rbegin() - 1);
        }

        st.insert(adj[i].size());
        for(auto j : adj[i])st.insert(adj[j].size());
    }

    cout<<ans<<endl;
}


int main(){
int t;
cin>>t;
while(t--){
    solve();
}
     return 0;
}
    












Solution 2 (runtime: 1108 ms):
#include<bits/stdc++.h>
using namespace std;
int N;

void solve() {
    cin >> N;
    vector<vector<int>> adj(N+1);
    for(int i = 0; i < N-1; i++) {
        int a, b; 
        cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    
    multiset<int, greater<int>> moves;
    for(int i = 1; i <= N; i++) {
        moves.insert(adj[i].size() - 1);
    }

    int ans = 0;
    for(int i = 1; i <= N; i++) {
        vector<int> removed;
        moves.erase(moves.find(adj[i].size() - 1));

        for(auto &u : adj[i]) {
            int cut = adj[u].size() - 1;
            moves.erase(moves.find(cut));
            moves.insert(cut - 1);
            removed.push_back(cut);
        }
        ans = max(ans, int(adj[i].size()) + int(*moves.begin()));

        moves.insert(adj[i].size() - 1);
        for(auto &r : removed) {
            moves.erase(moves.find(r - 1));
            moves.insert(r);
        }
    }
    cout << ans << endl;
}

int main() {
    int T;
    cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}