记录编号 73595 评测结果 AAAAAAAAAA
题目名称 文理分班 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.037 s
提交时间 2013-10-22 09:47:41 内存使用 3.28 MiB
显示代码纯文本
#include<fstream>
using namespace std;
ifstream fi("divideb.in");
ofstream fo("divideb.out");
int n,m,pp[51];
int stu[51]={0},home[51]={0},g[51][51]={0};
bool f[51]={true};
bool find(int u)
{
	int i;
	for(i=1;i<=m;i++)
	{
		if(g[u][i]==1&&!f[i])
		{
			f[i]=true;
			if(pp[i]==-1||find(pp[i]))
			{
				pp[i]=u;
				return true;
			}
		}
	}
	return false;
}
void hungary()
{

	int i,j;
	for(i=1;i<=m;i++)
	{
		if(stu[i]==0||(stu[i]==1&&home[i]==0))//不是在校生或者不回家
		{
			for(j=1;j<=m;j++) f[j]=0;
			if(!find(i))
			{
				fo<<"T_T"<<endl;return;
			}
		}
	}
	fo<<"^_^"<<endl;
}
int main()
{
	int i,j,k;
	fi>>n;
	for(i=1;i<=n;i++)
	{
		fi>>m;
		for(j=1;j<=m;j++)
		{
			fi>>stu[j];
			if(stu[j]!=0&&stu[j]!=1)stu[j]=0;
			pp[j]=-1;
		}
		for(j=1;j<=m;j++)
		{
			fi>>home[j];
			if(home[j]!=0&&home[j]!=1) home[j]=0;
		}
		for(j=1;j<=m;j++)
			for(k=1;k<=m;k++)
			{
				fi>>g[j][k];
				if(g[j][k]!=0&&g[j][k]!=1) g[j][k]=0;
				if(j==k) g[j][k]=1;
				if(stu[k]==0) g[j][k]=0;
			}
		hungary();
	}
	return 0;
}