最大独立集=点数-最大匹配。
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=500+5;
bool line[maxn][maxn],used[maxn];
int match[maxn],n;
string sex[maxn],music[maxn],sport[maxn];
int h[maxn];
bool find(int i)
{
for(int j=1;j<=n;j++)
{
if(line[i][j]==true&&used[j]==false)
{
used[j]=true;
if(match[j]==-1||find(match[j]))
{
match[j]=i;
return true;
}
}
}
return false;
}
bool ok(int i,int j)
{
if(abs(h[i]-h[j])>40) return false;
if(sex[i]==sex[j]) return false;
if(music[i]!=music[j]) return false;
if(sport[i]==sport[j]) return false;
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(line,false,sizeof(line));
memset(match,-1,sizeof(match));
scanf("%d",&n);
for(int i=1;i<=n;i++) {cin>>h[i]>>sex[i]>>music[i]>>sport[i];}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) continue;
if(ok(i,j)) {line[i][j]=true;}
}
}
int ans=0;
for(int i=1;i<=n;i++){
memset(used,false,sizeof(used));
if(find(i)) ans+=1;
}
printf("%d\n",n-ans/2);
}
return 0;
}