以行,列为左右部点,跑最大匹配,匹配数为n即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T,n,tim;
int g[205][205];int vis[205],match[205];
bool dfs(int x) {
for(int i=1;i<=n;i++)
if(g[x][i]&&(vis[i]!=tim)) {
vis[i]=tim;
if(!match[i]||dfs(match[i])) {match[i]=x;return 1;}
}
return 0;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
memset(g,0,sizeof g);
memset(match,0,sizeof match);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&g[i][j]);
int ans=0;
tim=0;
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++)
++tim,ans+=(int)dfs(i);
if(ans!=n) puts("No");
else puts("Yes");
}
}