不知道怎么就这样建图,直觉吧,
去再看一看二分图匹配
我们知道,对于每一行来说,交换行,是不改变这行的状态的,
交换列只是改变颜色的顺序,对于颜色的个数也没有改变,列
也同样存在这一性质
那么最后我们要求的是主对角线上都是黑色,也就是每行选一个黑
色的,且任意两行选的黑色的不在同一列,我们构造一张二分图,
图的一边是行,另一边是列,所以对于每个黑点连边,二分图匹配即可
,每行一个黑色,且任意两行所选的不在一列,如果行1和列2相连了,就代表行1已经有匹配的了,最终如果一个点没有相匹配的,就no即可如果两个点连了同一列说明这两个行只能选一个,由此限制住了
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int li[209],n,a[209][209];
bool use[209]={false};
bool dfs(int u)
{
if (use[u]) return false;
use[u]=true;
for (int i=1;i<=n;i++)
if (a[u][i]&&(li[i]==0||dfs(li[i])))//别忘了是li【i】
{
li[i]=u;
return true;
}
return false;
}
int work()
{
int ans=0;
for (int i=1;i<=n;i++)
{
memset(use,false,sizeof(use));
if (dfs(i)) ans++;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
memset(li,0,sizeof(li));
memset(a,0,sizeof(a));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);
int k=work();
if (k==n) printf("Yes\n");else printf("No\n");
}
return 0;
}