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

Solution 1 (runtime: 328 ms):
#include <bits/stdc++.h>
using namespace std;
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int t; 
    cin >> t;
    while(t--){
        int n; 
        cin >> n;
        // deg[i] هتخزن درجة الرأس i (من 1 لـ n)
        vector<int> deg(n+1, 0);
        // هنعمل قائمة للجيران لكل رأس
        vector<vector<int>> adj(n+1);
        for(int i = 1; i <= n-1; i++){
            int u, v;
            cin >> u >> v;
            deg[u]++;
            deg[v]++;
            adj[u].push_back(v);
            adj[v].push_back(u);
        }
 
        // لتحقق سريع إذا رأسين متوصلين، هنعمل unordered_set لكل رأس
        vector<unordered_set<int>> neighbors(n+1);
        for (int i = 1; i <= n; i++){
            for(auto nb: adj[i]){
                neighbors[i].insert(nb);
            }
        }
 
        int best = 0; // هنا هنبقي نحفظ أفضل نتيجة لقيمة candidate
 
        // أولاً: نمر على كل حافة (u,v) ونحسب candidate = deg(u)+deg(v)-2
        for (int u = 1; u <= n; u++){
            for(auto v: adj[u]){
                if(u < v){ // عشان كل حافة تتحسب مرة واحدة
                    best = max(best, deg[u] + deg[v] - 2);
                }
            }
        }
 
        // ثانياً: نفكر في الحالة اللي u و v مش متصلين
        // هنجهز مصفوفة من الرؤوس بدرجاتهم ونرتبها تنازلياً.
        vector<pair<int,int>> verts;
        verts.reserve(n);
        for (int i = 1; i <= n; i++){
            verts.push_back({deg[i], i});
        }
        // ترتيب تنازلي على حسب الدرجة ولو متساوية على حسب رقم الرأس
        sort(verts.begin(), verts.end(), [](const pair<int,int>& a, const pair<int,int>& b){
            if(a.first == b.first) return a.second < b.second;
            return a.first > b.first;
        });
 
        int K = min(n, 300); // نختار أعلى K رؤوس
        // دلوقتي، لكل رأس u، ندور بين أعلى K رؤوس عشان نلاقي أول v بحيث v ≠ u ومش متصلين.
        for (int u = 1; u <= n; u++){
            for (int i = 0; i < K; i++){
                int v = verts[i].second;
                if(v == u) continue;
                // لو u و v متصلين، نسيب الحالة دي لأن لو كانوا متصلين، معادلتنا بتدي deg(u)+deg(v)-2 والحق ده اتحسب فوق.
                if(neighbors[u].find(v) != neighbors[u].end()) continue;
                // الحالة دي: u و v مش متصلين، فـ candidate = deg(u) + deg(v) - 1.
                best = max(best, deg[u] + deg[v] - 1);
                break; // مش محتاجين ندور أكتر لرأس u، أول v عالي الدرجة هيكفي.
            }
        }
 
        cout << best << "\n";
    }
    return 0;
}


Solution 2 (runtime: 1452 ms):
#include<iostream>
#include<vector>
#include<string>
#include<stack>
#include<set>
#include<string.h>
#include<cstdio>
#include<map>
#include<math.h>
#include<algorithm>
#include<queue>
#include<utility>
#include<unordered_map>
#include<bitset>
#include<iomanip>
using namespace std;
#define IOS ios::sync_with_stdio;cin.tie(0);
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define ll long long
#define lf double
#define MAX_NUM 10000
void solve(){
	int n;
	cin>>n;
	map<int,int>du;
//	map<int,int>reserve_du;
	map<int,set<int>>child;
	for(int i=1;i<=n-1;i++){
		int a,b;
		cin>>a>>b;
		du[a]+=1;
		du[b]+=1;
		child[a].insert(b);
		child[b].insert(a);
	}
	
	vector<int>ans_arr;
	int max_du=-1;
	int cnt=5;
	for(auto x:du)max_du=max(max_du,x.second);
	for(auto x:du){
		if(x.second!=max_du)continue;
		int ord=x.first;
		for(int i=1;i<=n;i++){
			if(i==ord)continue;
			if(child[ord].find(i)!=child[ord].end()){
				ans_arr.push_back(du[ord]+du[i]-2);
			}else {
				ans_arr.push_back(du[ord]+du[i]-1);
			}
		}
		if(cnt--==0)break;
	}
	int ans=-1;
	for(auto x:ans_arr){
		ans=max(ans,x);
	}
	cout<<ans<<endl;
}
int main(){
	IOS;
	int T;
	cin>>T;
//	T=1;
	while(T--){
		solve();
	}
	return 0;
}