RT
#include<iostream>
#include<queue>
#include<cstring>
//#include<ctime>
using namespace std;
struct Edge { int end, next, cap, flow; }e[400000];
int head[405], cnt;
void addedge(int u, int v, int f) { e[cnt] = { v,head[u],f,0 }, head[u] = cnt++; }
int n;
int dis[405];
bool BFS(int s, int t)
{
for (int i = 1;i <= n * 2 + 2;++i)dis[i] = 0;
queue<int>q;
q.push(s);
dis[s] = 1;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = head[u];~i;i = e[i].next)
{
if (!dis[e[i].end] && e[i].cap > e[i].flow)
{
dis[e[i].end] = dis[u] + 1;
q.push(e[i].end);
}
}
}
return dis[t];
}
int cur[205];
int DFS(int s, int t, int flow)
{
if (s == t || !flow)return flow;
int ret = 0, d;
for (int& i = cur[s];~i;i = e[i].next)
{
if (dis[e[i].end] == dis[s] + 1 && (d = DFS(e[i].end, t, min(e[i].cap - e[i].flow, flow - ret))))
{
ret += d;
e[i].flow += d;
e[i ^ 1].flow -= d;
if (ret == flow)return ret;
}
}
return ret;
}
int Dinic()
{
int ans = 0;
while (BFS(2 * n + 1, 2 * n + 2))
{
for (int i = 1;i <= 2 * n + 2;++i)cur[i] = head[i];
ans += DFS(2 * n + 1, 2 * n + 2, 0x3f3f3f3f);
}
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
//clock_t cl = clock();
//freopen("P1129_7.in", "r", stdin);
//freopen("alpha.out", "w", stdout);
memset(head, -1, sizeof head);
int t;
cin >> t;
while (t--)
{
for (int i = 1;i <= n * 2 + 2;++i)head[i] = -1;
cin >> n;
cnt = 0;
for (int i = 1;i <= n;++i)
{
addedge(2 * n + 1, i, 1);
addedge(i, 2 * n + 1, 0);
addedge(i + n, 2 * n + 2, 1);
addedge(2 * n + 2, i + n, 0);
}
for (int i = 1, a;i <= n;++i)
for (int j = n + 1;j <= n + n;++j)
{
cin >> a;
if (a)
{
addedge(i, j, 1);
addedge(j, i, 0);
}
}
if (Dinic() == n)cout << "Yes\n";
else cout << "No\n";
}
//cout << clock() - cl;
return 0;
}