#include<bits/stdc++.h>
using namespace std;
const int inf=0x7f7f7f7f;
int cnt=1,ans,res,head[100005],dis[100005],cur[100005];
bool vis[100005];
int n,m,s,t,liu;
struct Node{
int nxt,v,liu,c;
}node[100005];
inline void add_bian(int u,int v,int liu,int c){
node[++cnt].v=v;
node[cnt].liu=liu;
node[cnt].nxt=head[u];
node[cnt].c=c;
head[u]=cnt;
node[++cnt].v=u;
node[cnt].liu=0;
node[cnt].nxt=head[v];
node[cnt].c=-c;
head[v]=cnt;
}
queue<int>q;
int spfa(){
memset(dis,0x7f,sizeof(dis));
q.push(s);
dis[s]=0;
vis[s]=1;
while(!q.empty()){
int u=q.front();
q.pop(),vis[u]=0;cur[u]=head[u];
for(int i=head[u];i;i=node[i].nxt){
int v=node[i].v;
if(node[i].liu&&(dis[v]>dis[u]+node[i].c)){
dis[v]=dis[u]+node[i].c;
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
return dis[t]!=inf;
}
int dfs(int u,int flow){
if(u==t)return flow;
vis[u]=1;
int ans=0;
for(int i=cur[u];i&&ans<flow;i=node[i].nxt){
int v=node[i].v;cur[u]=i;
if(!vis[v]&&node[i].liu&&dis[v]==dis[u]+node[i].c){
int x=dfs(v,min(node[i].liu,flow-ans));
if(x)res+=x*node[i].c,node[i].liu-=x,node[i^1].liu+=x,ans+=x;
}
}
vis[u]=0;
return ans;
}
int Dinic(){
int x;
while(spfa()){
while(x=dfs(s,inf))ans+=x;
}
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,a;
cin>>m;
s=80001;t=80002;
while(m--){
cin>>n;
for(int i=1;i<=n;i++)add_bian(s,i,1,1);
for(int i=1;i<=n;i++)add_bian(i+n,t,1,1);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a;
if(a)add_bian(i,j+n,1,1);
}
}
if(Dinic()==n)cout<<"Yes\n";
else cout<<"No\n";
memset(node,0,sizeof(node));
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
memset(cur,0,sizeof(cur));
cnt=0;ans=0;
}
return 0;
}