#include<cstdio>
#include<cstring>
#include<string>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<map>
#include<vector>
#include<stack>
#define inf 0x3f3f3f3f
#include<queue>
using namespace std;
typedef long long ll;
const int N=1005;
int match[N][N];//左边和右边第几次匹配
int vis[N];//标记数组
int e[N][N];//存图
int cut[N];//右边当前匹配次数
int vol[N];//右边可以匹配的次数
int n,m;//左右点的个数
int found(int u)
{
for(int i=1;i<=m;i++)
{
if(e[u][i]&&!vis[i])
{
vis[i]=1;
if(cut[i]<=vol[i])//如果当前匹配数小于最大匹配数,可以直接匹配
{
match[i][cut[i]++]=u;
return true;
}
for(int j=0;j<cut[i];j++)//如果先前已匹配右边的点能另外找到增广路,则此点仍可匹配
{
if(found(match[i][j]))
{
match[i][j]=u;
return true;
}
}
}
}
return false;
}
int solve_all()//判断是否完全匹配
{
memset(match,-1,sizeof(match));
memset(cut,0,sizeof(cut));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(!found(i)) return false;
}
return true;
}
int solve_match()//计算最大匹配数
{
int ans=0;
memset(match,-1,sizeof(match));
memset(cut,0,sizeof(cut));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(found()) ans++;
}
return ans;
}