Solution
难得我能想出构图。
做法是二分图完美匹配,其实看到题就可以隐约猜到是把行和列连边。
建图方法是把黑点(i,j)的行i向列j连一条边,这显然是一个二分图模型,判断有无完美匹配即可。看上去很符合直觉,但我们需要它的严谨证明。
有篇博文中有详细证明,下面给出链接:
dalao的证明 支持大佬这种严谨的态度!
代码中可能的错误:匈牙利中不要把match[i]打成i,还有Yes只有第一位大写。
CODE
#include<bits/stdc++.h>
using namespace std;
const int MAXN=205;
bool vis[MAXN],a[MAXN][MAXN];
int match[MAXN],n,s;
bool dfs(int k)
{
for (int i=1;i<=n;i++)
if (a[k][i] && !vis[i])
{
vis[i]=true;
if (match[i]==0 || dfs(match[i]))
{
match[i]=k;
return true;
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
memset(a,false,sizeof(a));
memset(match,0,sizeof(match));
s=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==1) a[i][j]=true;
}
for (int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if (dfs(i)) s++;
}
if (s==n) printf("Yes\n");
else printf("No\n");
}
return 0;
}