求二分图最大匹配,直接读入就行,图都不用建
可以当成最大匹配的模板。。
#include<iostream>
#include<cstring>
#include<cstdio>
const int MAXN=510;
int uN,vN;//u,v数目
int g[MAXN][MAXN];
int linker[MAXN];
bool used[MAXN];
bool dfs(int u)//从左边开始找增广路径
{
int v;
for(v=1;v<=vN;v++)//这个顶点编号从0开始,若要从1开始需要修改
if(g[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||dfs(linker[v]))
{//找增广路,反向
linker[v]=u;
return true;
}
}
return false;//这个不要忘了,经常忘记这句
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=1;u<=uN;u++)
{
memset(used,0,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
int T,Ti;
scanf("%d",&T);
for (Ti=1;Ti<=T;Ti++)
{
scanf("%d",&uN);
vN=uN;
for (int i=1;i<=uN;i++)
for (int j=1;j<=uN;j++)
scanf("%d",&g[i][j]);
if (hungary()==uN) printf("Yes\n"); else printf("No\n");
}
while (1);
return 0;
}