# [BZOJ1433]&&[ZJOI2009] 假期的宿舍

1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0

## 样例输出 SampleOutput

^_^

BZOJ 1433

``````#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=55;
int i,j,t,n,m,l,r,k,z,y,x;
struct edge
{
int to,nx;
}e[maxn*maxn];
int mat,cnt,sum,T;
bool iss[maxn],sta[maxn];
inline void ins(int u,int v)
{
}
bool crosspath(int s,int now)
{
int i,v;
{
v=e[i].to;
if (used[v]!=now)
{
used[v]=now;
if (!match[v] || crosspath(match[v],now))
{
match[v]=s;
return true;
}
}
}
return false;
}
inline bool hungary()
{
int i;
memset(match,0,sizeof(match));
memset(used,0,sizeof(used));
for (i=n+1;i<=n+n;i++) if (sta[i-n])
{
if (!crosspath(i,i)) return false;
}
return true;
}
int main()
{
scanf("%d",&T);
while (T--)
{
sum=cnt=mat=0;
memset(iss,0,sizeof(iss));
memset(sta,0,sizeof(sta));
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&x),iss[i]=x;
for (i=1;i<=n;i++)
{
scanf("%d",&x);
if (iss[i] && x) sta[i]=0;
else sta[i]=1;
}
for (i=1;i<=n;i++) if (iss[i] && sta[i]) ins(n+i,i);
for (i=1;i<=n;i++) for (j=1;j<=n;j++)
{
scanf("%d",&x);
if (x)
{
if (iss[i]) ins(n+j,i);
if (iss[j]) ins(n+i,j);
}
}
if (hungary()) printf("^_^\n");
else printf("T_T\n");
}
return 0;
}``````