一开始有一个错误的类似贪心的思路···
其实是二分图求最大匹配
这种抽象建模的题看不出来真的要命啊
但是一般二分图建模的套路就是这种涉及只有两种数字的可以表示行列关系的
这道题我们把黑色格子在的行和列连边
换行换列操作对图本身的最大匹配没有影响
所以直接原图跑匈牙利就好了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define maxn 405
using namespace std;
int t,n,a[maxn][maxn],lk[maxn],ans;
bool vis[maxn];
inline int rd(){
int x=0,f=1;char c=' ';
while(c<'0' || c>'9') {if(c=='-')f=-1;c=getchar();}
while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();
return x*f;
}
void init(){
memset(a,0,sizeof a); memset(lk,0,sizeof lk); ans=0;
}
bool dfs(int u){
for(int i=1;i<=n;i++)
if(a[u][i] && !vis[i]){
vis[i]=1;
if(!lk[i] || (dfs(lk[i]))){
lk[i]=u;//这里i和u写反wa了好几次
return true;
}
}
return false;
}
int main(){
t=rd();
while(t--){
n=rd();
init();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) a[i][j]=rd();
for(int i=1;i<=n;i++){
memset(vis,0,sizeof vis);
if(dfs(i)) ans++;
}
if(ans==n) puts("Yes");
else puts("No");
}
return 0;
}