RT,求助(会关注的)!
代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define N 100010
#define M 100010
using namespace std;
struct Edge{
int from;
int to;
int next;
};
Edge edge[M];
int head[N],cnt;
int ans,matched[N];
bool vis[N];
int n,T;
string sex[N],inest1[N],inest2[N];
int high[N];
inline void add_Edge(int f,int t)
{
cnt++;
edge[cnt].from=f;
edge[cnt].to=t;
edge[cnt].next=head[f];
head[f]=cnt;
}
inline bool find(int k)
{
for(int i=head[k];i;i=edge[i].next)
{
int t=edge[i].to;
if(vis[t])continue;
vis[t]=1;
if(!matched[t]||find(matched[t]))
{
matched[t]=k;
return true;
}
}
return false;
}
inline void match()
{
for(int i=1;i<=n;i++)
{
if(sex[i]!="M")continue;
memset(vis,0,sizeof(vis));
if(find(i))ans++;
}
}
int main()
{
T=read();
while(T--)
{
ans=0,cnt=0;
memset(head,0,sizeof(head));
memset(matched,0,sizeof(matched));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>high[i]>>sex[i]>>inest1[i]>>inest2[i];
for(int j=1;j<i;j++)
{
if(sex[j]==sex[i])continue;
if(abs(high[i]-high[j])>40)continue;
if(inest1[i]!=inest1[j])continue;
if(inest2[i]==inest2[j])continue;
add_Edge(i,j);
add_Edge(j,i);
}
}
match();
cout<<n-ans<<'\n';
}
return 0;
}