题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059
【分析】
格子是可以随意变换的,但是原来同行或同列的格子无论怎么变换还是同行同列的。
那么就分行和列做一个二分图匹配,完美匹配时关卡有解。
每次做这种题目都会忘了把图重新初始化...
【代码】
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=210;
int head[maxn],next[maxn*maxn],E[maxn*maxn],Ecnt;
int mat[maxn],vis[maxn];
int n;
inline void Add_Edge(int x,int y) {next[++Ecnt]=head[x];head[x]=Ecnt;E[Ecnt]=y;}
void Init()
{
for (int i=1;i<=n;i++) head[i]=0;Ecnt=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
int x;
scanf("%d",&x);
if (x) Add_Edge(i,j);
}
memset(mat,0,sizeof(mat));
}
bool Find(int x)
{
for (int i=head[x];i;i=next[i]) if (!vis[E[i]])
{
vis[E[i]]=1;
if (!mat[E[i]] || Find(mat[E[i]])) {mat[E[i]]=x;return true;}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
Init();
for (int i=1;i<=n;i++) memset(vis,0,sizeof(vis)),Find(i);
int flag=1;for (int i=1;i<=n;i++) if (mat[i]==0) flag=0;
if (flag) printf("Yes\n");else printf("No\n");
}
}