#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int t,n,tag;
int home[110],school[110],pd[110],pre[110];
int m[110][110];
struct arcnode {
int v;
arcnode *next;
};
struct vexnode {
int u;
arcnode *firstarc;
} vex[110];
void addline(int u,int v) {
arcnode *p=new arcnode;
p->v=v;
p->next=vex[u].firstarc;
vex[u].firstarc=p;
}
int dfs(int u) {
arcnode *p=vex[u].firstarc;
while(p!=NULL) {
if(!pd[p->v]) {//如果不在增广路径中
pd[p->v]=1;
if(!pre[p->v]||dfs(pre[p->v])) {
pre[p->v]=u;
return 1;
}
}
p=p->next;
}
return 0;
}
int main() {
cin>>t;
while(t>0) {
t--;
tag=0;
memset(school,0,sizeof(school));
memset(vex,0,sizeof(vex));
memset(home,0,sizeof(home));
memset(m,0,sizeof(m));
memset(pre,0,sizeof(pre));
cin>>n;
for(int i=1; i<=n; i++) {
scanf("%d",&school[i]);
}
for(int i=1; i<=n; i++) {
scanf("%d",&home[i]);
}
for(int i=1; i<=n; i++) {
if(school[i])addline(i,n+i);
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
int a=0;
cin>>a;
if(a==1&&!m[i][j]) {
m[i][j]=1;
if(school[i]&&!home[j])addline(j,n+i);
if(school[j]&&!home[i])addline(i,n+j);
}
}
}
for(int i=1; i<=n; i++) {
memset(pd,0,sizeof(pd));
if(!home[i]||(home[i]&&!school[i])){
if(!dfs(i)) {
cout<<"T_T"<<endl;
tag=1;
}
}
}
if(!tag)cout<<"^_^"<<endl;
}
return 0;
}
/*
1
2
1 0
0 1
0 1
1 0
*/
思路就是匈牙利算法,数组初始化也做了,但是是全wa,球球牛牛们帮忙看看哪里错了,或者给我一组数据试试,因为我这里不知道为啥连数据都不能下载