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

Solution 1 (runtime: 249 ms):
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define unmap unordered_map
#define unset unordered_set
#define MAXQ priority_queue
using namespace std;
template<typename T> using MINQ=priority_queue<T,vector<T>,greater<T> >;
using pii=pair<int,int>;
using vi=vector<int>;
using vii=vector<vi>;

#define maxn 1000010

int n;
int cnt,from[maxn],to[maxn],Next[maxn],head[maxn];
int f[maxn][3][3];

void add(int u,int v){
	cnt++;
	from[cnt]=u; to[cnt]=v;
	Next[cnt]=head[u]; head[u]=cnt;
}

void dfs(int u,int fa){
	int son=0,maxx=-1e9,maxy=-1e9;
	for(int i=head[u];i!=-1;i=Next[i]){
		int v=to[i]; if(v==fa)continue;
		dfs(v,u);son++;
		int x=max(f[v][1][0]-1,f[v][1][1]);
		if(x>=maxx){
			maxy=maxx;
			maxx=x;
		}else{
			if(x>=maxy)maxy=x;
		}
	}
	f[u][0][0]=1;
	f[u][1][1]=son;f[u][1][0]=-1e9;
	f[u][2][0]=f[u][2][1]=-1e9;
	if(son>=2)f[u][2][0]=max(f[u][2][0],maxx+maxy+1);
	for(int i=head[u];i!=-1;i=Next[i]){
		int v=to[i]; if(v==fa)continue;
		f[u][2][0]=max(f[u][2][0],max(f[v][2][1]+1,f[v][2][0]));
		f[u][2][1]=max(f[u][2][1],max(f[v][1][0]+son-1,f[v][1][1]+son-1));
		f[u][1][0]=max(f[u][1][0],max(f[v][1][1]+1,f[v][1][0]));
	}
}

void solve(){cnt=0;
	cin>>n;
	for(int i=1;i<=n;i++)head[i]=-1;
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);add(v,u);
	}
	dfs(1,0);
	// for(int i=1;i<=n;i++)cout<<f[i][1][0]<<' '<<f[i][1][1]<<endl;
	cout<<max(f[1][2][0],f[1][2][1])<<endl;

	return ;
}

signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	int _t=1;
	cin>>_t;
	//cout<<fixed<<setprecision(20);
	for(int i=1;i<=_t;i++){
		//cout<<"Case "<<i<<": ";
		solve();
	}
	return 0;
}

Solution 2 (runtime: 390 ms):
#include <bits/stdc++.h>
using namespace std;
#define fast_io ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define int long long
#define ll long long
#define mod 1000000007

vector<int> f(int n) {
    vector<int> v(61, 0);
    for (int i = 60; i >= 0; --i) {
        v[i] = (n & 1);
        n >>= 1;
    }
    return v;
}

signed main(){
    fast_io;
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        vector<set<int>> adj(n+1);
        vector<int> count(n+1,0);
        for(int i=0;i<n-1;i++){
            int u,v;
            cin>>u>>v;
            adj[u].insert(v);
            adj[v].insert(u);
            count[u]++;
            count[v]++;
        }
        map<int,set<int>> mp;
        set<int> sety;
        for(int i=1;i<=n;i++){
            mp[count[i]].insert(i);
            sety.insert(count[i]);
        }
        if(n==2){
            cout<<0<<endl;
        }
        else{
        int count1=mp[*sety.rbegin()].size();
        //cout<<count1<<endl;
        if(count1==1 && sety.size()>1){
            int flag=0;
            int ans=*sety.rbegin();
            //cout<<ans<<endl;
            auto it2=sety.rbegin();
            ++it2;
            int val=*it2;
            ans+=val;
            //cout<<ans<<endl;
            int maxval=*mp[*sety.rbegin()].begin();
            //cout<<maxval<<endl;
            for(auto it:mp[val]){
                if(!adj[maxval].count(it)){
                    flag=1;
                    break;
                }
            }
            if(!flag){
                ans-=2;
            }
            else{
                ans--;
            }
            cout<<ans<<endl;
        }
        else if(count1==2){
            int ans=((*sety.rbegin())*2)-1;
            int maxval=*mp[*sety.rbegin()].begin();
            auto it=mp[*sety.rbegin()].begin();
            it++;
            int maxval2=*it;
            if(adj[maxval].count(maxval2)){
                ans--;
            }
            cout<<ans<<endl;
        }
        else{ 
            int ans=((*sety.rbegin())*2)-1;
            int val=*sety.rbegin();
            cout<<ans<<endl;
        }
        }
    }   
}