题目大意:给定一个n×n的01矩阵,可以任意交换两行或两列的数字,问是否能调整出一个局面,使得矩阵的主对角线(左上角到右下角的连线)上都是1。
题解:想到把行和列建成二分图了,可是没想好具体怎么搞……膜了一发题解
Orz
黄学长说,同行同列的点交换后还是同行同列,然后求能否找到n个互不同行互不同列的点。
我的收获:二分图
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int M=205;
int T,n,lik[M];
bool mp[M][M],vis[M];
bool hungary(int x)
{
for(int i=1;i<=n;i++){
if(!mp[x][i]||vis[i]) continue;
vis[i]=true;
if(!lik[i]||hungary(lik[i])) return lik[i]=x;
}
return false;
}
void work()
{
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(!hungary(i)) {puts("No");return ;}
}
puts("Yes");
}
void init()
{
int x;memset(lik,0,sizeof(lik));
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&x),mp[i][j]=(bool)x;
}
int main()
{
cin>>T;
while(T--)
{
init();
work();
}
return 0;
}