二分图匹配。
发现:无论怎么交换,同一行的还是同一行,同一列的还是同一列的。
所以直接建图,跑匈牙利就好了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 205
using namespace std;
int pp[N],n,T,g[N][N],cnt;
bool bo[N];
bool find(int x){
for(int i=1;i<=n;i++){
if(!bo[i]&&g[x][i]){
bo[i]=1;
if(!pp[i]||find(pp[i])){
pp[i]=x;
return 1;
}
}
}
return 0;
}
int main(){
scanf("%d",&T);
while(T--){
cnt=0;
memset(pp,0,sizeof pp);
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&g[i][j]);
for(int i=1;i<=n;i++){
memset(bo,0,sizeof bo);
if(find(i))cnt++;
}
if(cnt==n)printf("Yes\n");
else printf("No\n");
}
return 0;
}