一行内如果没有被染色的块,那么就不可能通过行列变换使得满足结果
一列也是如此
那么只需要在每一行和每一列都有被染色的就可以了,这样就转换成了二分图完美匹配的问题
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200+10;
int T, n;
int g[maxn][maxn];
int used[maxn];
int line[maxn][maxn];
int other_side[maxn];
bool Find(int x)
{
for(int i = 1 ; i <= n ; i++)
{
if(line[x][i] && !used[i])
{
used[i] = 1;
if(other_side[i] == 0 || Find(other_side[i]))
{
other_side[i] = x;
return 1;
}
}
}
return 0;
}
void solve()
{
int sum = 0;
for(int i = 1 ; i <= n ; i++)
{
memset(used,0,sizeof(used));
if(Find(i))
{
sum++;
}
}
if(sum >= n) cout << "Yes" << endl;
else cout << "No" << endl;
}
void init()
{
memset(line,0,sizeof(line));
memset(other_side,0,sizeof(other_side));
memset(used,0,sizeof(used));
}
int main()
{
ios::sync_with_stdio(false);
cin >> T;
while(T--)
{
init();
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
cin >> line[i][j];
}
}
solve();
}
return 0;
}