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

Code 1:
#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][2][2];

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;
	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);
	}
	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;
}

Code 2:
#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;
}

Answer: 2