传送门
同行的点经过变换之后仍然同行
同列的点经过变换之后仍然同列(以上结论自己yy)
于是问题转化为求不同行且不同列的n个点。
用二分图匹配水过。
#include<cstring>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
int a[205][205],b[205],v[205],t,n,fl;
int dfs(int x){
for (int i=1;i<=n;i++)
if (!v[i]&&a[x][i]){
v[i]=1;
if (!b[i]||dfs(b[i])){
b[i]=x;
return 1;
}
}
return 0;
}
int main(){
scanf("%d",&t);
while (t--){
fl=1;
scanf("%d",&n);
memset(b,0,sizeof(b));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);
for (int i=1;i<=n;i++){
memset(v,0,sizeof(v));
fl&=dfs(i);
}
if (fl) printf("Yes\n"); else printf("No\n");
}
return 0;
}