记录编号 |
353521 |
评测结果 |
AAAAAAAAAA |
题目名称 |
文理分班 |
最终得分 |
100 |
用户昵称 |
Hzoi_Yniverse |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.036 s |
提交时间 |
2016-11-18 08:33:14 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=60;
struct Edge{ int to,next; }e[maxn*maxn];
int n,cnt1,cnt2,len;
int bel[maxn],hav[maxn],head[maxn],Linkx[maxn],Linky[maxn];
bool flag[maxn];
void Insert(int x,int y){
len++;
e[len].to=y; e[len].next=head[x];
head[x]=len;
}
void Clear(){
len=cnt1=cnt2=0;
memset(hav,0,sizeof(hav));
memset(bel,0,sizeof(bel));
memset(Linkx,0,sizeof(Linkx));
memset(Linky,0,sizeof(Linky));
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
}
bool Hungary(int x){
for(int i=head[x];i;i=e[i].next){
int j=e[i].to;
if(!flag[j]){
flag[j]=1;
if(!Linky[j]||Hungary(Linky[j])){
Linkx[x]=j; Linky[j]=x; return 1;
}
}
}
return 0;
}
int main(){
freopen("divideb.in","r",stdin);
freopen("divideb.out","w",stdout);
int t;scanf("%d",&t);
while(t--){
Clear();
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
if(x) hav[i]=++cnt1;//记录凳子
}
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
if(!x||!hav[i]) bel[i]=++cnt2;//记录人
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;scanf("%d",&x);
if(x||i==j){
//if(hav[i]&&bel[j]) Insert(hav[i],bel[j]);
if(bel[j]&&hav[i]) Insert(hav[i],bel[j]);
}
}
}
int ans=0;
for(int i=1;i<=cnt1;i++){
memset(flag,0,sizeof(flag));
if(!Linkx[i]&&Hungary(i)) ans++;
}
if(ans==cnt2) printf("^_^\n");
else printf("T_T\n");
}
//while(1);
return 0;
}