二分图匹配
/*
n个不同行 不同列的点
*/
#include <cstdio>
#include <cstring>
#define lp(i,j,k) for(int i = j;i <= k;++i)
int t,T,n;
int Link[410];
int vis[410];
struct edge {
int v,next;
}e[80010];
int cnt,head[410];
int read_int () {
char c = getchar();
int re = 0;
for(;c > '9' || c < '0';c = getchar());
for(;c >= '0' && c <= '9';c = getchar())
re = re * 10 + c - '0';
return re;
}
void adde (int u,int v) {
e[++cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
e[++cnt].v = u;
e[cnt].next = head[v];
head[v] = cnt;
}
bool find (int u) {
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(vis[v])
continue;
vis[v] = 1;
if(!Link[v] || find(Link[v])) {
Link[v] = u;
Link[u] = v;
return 1;
}
}
return 0;
}
int main () {
T = read_int();
while(T--) {
memset(Link,0,sizeof Link);
memset(head,-1,sizeof head);
cnt = -1;
n = read_int();
lp(i,1,n)
lp(j,1,n) {
t = read_int();
if(t)
adde(i,j + n);
}
bool f = 0;
lp(i,1,n) {
if(!Link[i]) {
memset(vis,0,sizeof vis);
find(i);
}
if(!Link[i])
f = 1;
if(f)
break;
}
if(f)
printf("No\n");
else printf("Yes\n");
}
}