题目:
题解:
有一个很巧妙的转化思路,如果要求主对角线上都是黑色的话,就是要求有n个点列不重复出现在每一行
然后就是如果x是1的话就把i,j连边,做一个最大匹配
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 205
using namespace std;
int tot,nxt[N*N*4],point[N*N*4],v[N*N*4];
int belong[N*N],vis[N*N];
void addline(int x,int y)
{
++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;
}
void cl()
{
tot=0;
memset(vis,0,sizeof(vis));
memset(point,0,sizeof(point));
memset(belong,0,sizeof(belong));
memset(nxt,0,sizeof(nxt));
}
bool find(int x,int k)
{
for (int i=point[x];i;i=nxt[i])
if (vis[v[i]]!=k)
{
vis[v[i]]=k;
if (!belong[v[i]] || find(belong[v[i]],k))
{
belong[v[i]]=x;
return true;
}
}
return false;
}
int main()
{
int T,n,i,j,x;
scanf("%d",&T);
while (T--)
{
cl();
scanf("%d",&n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
scanf("%d",&x);
if (x) addline(i,j+n);
}
bool fff=true;
for (i=1;i<=n;i++)
if (!find(i,i))
{
printf("No\n"); fff=false; break;
}
if (fff) printf("Yes\n");
}
}