这题前几天就做了,只不过dinic没过,后来发现是加边的时候傻逼地写错了一些东西。。这次学了一下匈牙利算法,好神的样子,不过dinic跑二分图的时候进程应该是一样(吧)。。
http://blog.csdn.net/dark_scope/article/details/8880547强力推荐这个。。思想就是一一对点进行匹配,如果有直接可以匹配的就匹配上去,否则就尝试矫正前面的匹配来给当前点腾出位置。。
匈牙利:
#include<cstdio>
#include<iostream>
#include<memory.h>
using namespace std;
int t,n,q,i,j,pre[205],a[205][205],u[205];
bool ok(int x)
{
for (int i=1;i<=a[x][0];i++)
if (!u[a[x][i]])
{
u[a[x][i]]=1;
if (!pre[a[x][i]]||ok(pre[a[x][i]])) {pre[a[x][i]]=x;return true;}
}
return false;
}
int hungary(int n)
{
int ans=0;
memset(pre,0,sizeof(pre));
for (int i=1;i<=n;i++)
{
memset(u,0,sizeof(u));
if (ok(i)) ans++;
}
return ans;
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
scanf("%d",&q);
if (q) a[i][++a[i][0]]=j;
}
if (hungary(n)==n) printf("Yes\n"); else printf("No\n");
}
}