由题意可得,这道题是求使一些行上的1是否能两两不同行,两两不同列。
于是我们就可以把1点的i与j连边,做一遍二分图匹配。
如果每一行即i都可以匹配到,那么就有解。
code:
/**************************************************************
Problem: 1059
User: yekehe
Language: C++
Result: Accepted
Time:360 ms
Memory:1448 kb
****************************************************************/ #include <bits/stdc++.h>
using namespace std;
int T,a[][],n,tot,vis[],wt[],ans;
bool find(int x){
for(int i=;i<=n;i++){
if(!vis[i]&&a[x][i]){
vis[i]=;
if(!wt[i]||find(wt[i])){
wt[i]=x;
return ;
}
}
}
return ;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(wt,,sizeof(wt));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
int ans=;
for(int i=;i<=n;i++){
memset(vis,,sizeof(vis));
ans+=find(i);
}
if(ans==n)puts("Yes");
else puts("No");
}
}