RT,实在找不出错误
#include<iostream>
#include<cstdio>
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
int n;
struct edge{
int nxt;
int to;
};
edge e[400005];
int h[200005];
int cnt;
void add(int x,int y){
e[++cnt].to=y;
e[cnt].nxt=h[x];
h[x]=cnt;
return;
}
int f[200005][19];
int dep[200005];
void dfs(int x,int fa){
f[x][0]=fa;
dep[x]=dep[fa]+1;
for(int i=h[x];i;i=e[i].nxt)
if(e[i].to!=fa) dfs(e[i].to,x);
return;
}
void pre(){
for(int j=1;j<=18;j++)
for(int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
return;
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=18;i>=0;i--)
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(x==y) return x;
for(int i=19;i>=0;i--)
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
return f[x][0];
}
int mp[25][25];
void q(int x,int y){
int l=lca(x,y);
int xx=x,yy=y;
while(xx!=l){
xx=f[xx][0];
mp[x][y]=max(mp[x][y],xx);
}
while(yy!=l){
yy=f[yy][0];
mp[x][y]=max(mp[x][y],yy);
}
return;
}
int dp[1<<20];
bool vis[1<<20];
int solve(int x){
if(vis[x]) return dp[x];
int ans=0;
for(int i=1;i<=n;i++){
if(x&(1<<(i-1))) continue;
for(int j=1;j<=n;j++){
if((x&(1<<(j-1)))||j==i) continue;
int k=mp[i][j];
if(!(x&(1<<(k-1)))&&k!=i&&k!=j) ans=max(ans,solve(x^(1<<(i-1))^(1<<(j-1))^(1<<(k-1)))+1);
}
}
dp[x]=ans;
vis[x]=1;
return ans;
}
void cf(){
n=read();
for(int i=1;i<n;i++){
int x=read(),y=read();
add(x,y);
add(y,x);
}
dfs(1,0);
pre();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j) q(i,j);
printf("%d\n",solve(0));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=0;
for(int i=1;i<=18;i++)
for(int j=1;j<=n;j++)
f[j][i]=0;
for(int i=1;i<=cnt;i++){
e[i].nxt=0;
e[i].to=0;
}
for(int i=1;i<=n;i++){
h[i]=0;
dep[i]=0;
}
for(int i=0;i<(1<<n);i++){
dp[i]=0;
vis[i]=0;
}
cnt=0;
return;
}
int main(){
int t=read();
for(int i=1;i<=t;i++)
cf();
return 0;
}