int nx,ny;
int map[maxn][maxn];
int cx[maxn],cy[maxn];
bool vis[maxn];
int findpath( int u )
{
for( int i = 1; i <= ny; i++ )
{
if( map[u][i] && !vis[i] )
{
vis[i] = 1;
if( cy[i] == -1 || findpath( cy[i] ) )
{
cy[i] = u;
cx[u] = i;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int ans = 0;
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
for( int i = 1; i <= nx; i ++ )
{
if( cx[i] == -1 )
{
memset(vis,0,sizeof(vis));
ans += findpath(i);
}
}
return ans;
}