题解见上一篇啦,这里是匈牙利算法版本。
#include
#include
const int N=210;
int T,n,map[N][N],rit[N];
bool flag,vis[N];
inline int read(){
int x=0,f=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return f?-x:x;
}
bool find(int u){
for(int i=1;i<=n;i++)
if(map[u][i]&&!vis[i]){
vis[i]=true;
if(!rit[i]||find(rit[i])){rit[i]=u;return true;}
}
return false;
}
int main(){
T=read();
while(T--){
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)map[i][j]=read();
memset(rit,0,sizeof rit);flag=true;
for(int i=1;i<=n;i++){
memset(vis,false,sizeof vis);
if(!find(i)){flag=false;break;}
}
if(flag)printf("Yes\n");
else printf("No\n");
}
return 0;
}