版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Game_Acm/article/details/82388692
int tol,head[maxn];
struct edge
{
int to,next;
}es[maxm];
void addedge( int u , int v )
{
es[tol].to = v;
es[tol].next = head[u];
head[u] = tol++;
}
int un,dis;
int mx[maxn],my[maxn];
int dx[maxn],dy[maxn];
bool used[maxn];
bool SearchP()
{
dis = inf;
queue<int>Q;
memset ( dx , -1 , sizeof(dx) );
memset ( dy , -1 , sizeof(dy) );
for ( int i=0 ; i<un ; i++ )
{
if ( mx[i]==-1 )
{
dx[i] = 0;
Q.push(i);
}
}
while( !Q.empty() )
{
int u = Q.front(); Q.pop();
if ( dx[u]>dis ) break;
for ( int i=head[u] ; i!=-1 ; i=es[i].next )
{
int v = es[i].to;
if ( dy[v]==-1 )
{
dy[v] = dx[u]+1;
if ( my[v]==-1 )
{
dis = dy[v];
}
else
{
dx[my[v]] = dy[v]+1;
Q.push(my[v]);
}
}
}
}
return dis!=inf;
}
bool dfs( int u )
{
for ( int i=head[u] ; i!=-1 ; i=es[i].next )
{
int v = es[i].to;
if ( !used[v]&&dy[v]==dx[u]+1 )
{
used[v] = true;
if ( my[v]!=-1&&dy[v]==dis ) continue;
if ( my[v]==-1||dfs(my[v]) )
{
my[v] = u;
mx[u] = v;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int res = 0;
memset ( mx , -1 , sizeof(mx) );
memset ( my , -1 , sizeof(my) );
while ( SearchP() )
{
memset ( used , false , sizeof(used) );
for ( int i=0 ; i<un ; i++ )
if ( mx[i]==-1&&dfs(i) ) res++;
}
return res;
}