#include<bits/stdc++.h>
#define toi (e[i].to)
#define tow (e[i].w)
#define row (e[i^1].w)
#define fore(now,i,arr) for(int i=arr[now];~i;i=e[i].next)
#define inf (0x3f3f3f3f)
using namespace std;
int n,cnt,head[505],s,t,ans,dp[505],cur[505];
bool vis[505];
struct EDGE{
int to,next,w;
}e[50005];
inline void init(){
memset(e,-1,sizeof(e));
memset(head,-1,sizeof(head));
ans=0;cnt=-1;
}
inline void addedge(int u,int v){
e[++cnt].to=v;
e[cnt].w=1;
e[cnt].next=head[u];
head[u]=cnt;
e[++cnt].to=u;
e[cnt].w=0;
e[cnt].next=head[v];
head[v]=cnt;
}
bool bfs(){
for(int i=0;i<505;i++)
cur[i]=head[i],dp[i]=inf,vis[i]=false;
queue<int> q;
q.push(s);
dp[s]=0;
while(!q.empty()){
int now=q.front();
q.pop();
if(now==t)
return true;
fore(now,i,head)
if(tow&&!dp[toi]){
q.push(toi);
dp[toi]=dp[now]+1;
}
}
return false;
}
int dfs(int now,int f){
if(now==t){
ans+=f;
return f;
}
int used=0;
fore(now,i,cur){
cur[now]=i;
if(!tow||dp[toi]!=dp[now]+1)
continue;
int k=dfs(toi,min(tow,f-used));
if(k){
used+=k;
tow-=k;
row+=k;
if(used==f)
break;
}
}
return used;
}
void Dinic(){
while(bfs())
dfs(s,inf);
}
int T;
void solve(){
init();
cin>>n;
s=n*2+1,t=s+1;
for(int i=1;i<=n;i++)
addedge(s,i),addedge(i+n,t);
for(int i=1,k;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>k;
if(k)
addedge(i,j+n);
}
Dinic();
cout<<(ans==n?"Yes":"No")<<'\n';
}
int main(){
cin>>T;
while(T--)
solve();
return 0;
}