匈牙利算法RE求救(会关注的)
查看原帖
匈牙利算法RE求救(会关注的)
189181
exit0楼主2021/5/18 21:13

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;
}
2021/5/18 21:13
加载中...