// ** Start of MaximumMatch *******************************
// Name: MaximumMatch by Hungray O(n^3)
// Description: mat is the adjacency matrix, nx,ny are the size of x and y,
// fy is used for marking whether the k-th node is visited, matx[x] means x
// match matx[x], maty[y] means y match maty[y], actually, matx[x] is useless,
// all the arrays start at 1
int nx,ny,mat[MAXN][MAXN],fy[MAXN],matx[MAXN],maty[MAXN];
int path(int u)
{
int v;
for(v=1;v<=ny;v++)
if((mat[u][v])&&(fy[v]<0)) {
fy[v]=1;
if((maty[v]<0)||(path(maty[v]))) {
matx[u]=v;
maty[v]=u;
return(1);
} // end of if((maty[v]...
} // end of if((mat[u][v]...
return(0);
} // end of int path()
int MaximumMatch()
{
int i,ret=0;
memset(matx,-1,sizeof(matx));
memset(maty,-1,sizeof(maty));
for(i=1;i<=nx;i++)
if(matx[i]<0) {
memset(fy,-1,sizeof(fy));
ret+=path(i);
} // end of if(matx[i]...
return(ret);
} // end of int MaximumMatch()
// ** End of MaximumMatch *********************************