http://acm.hdu.edu.cn/showproblem.php?pid=2063
一道典型的二分图的匹配。将女生与男生区分开作为两个不同的集合,如果女生a愿意和男生b一起,那么a ,b之间连线。然后对女生中的每一个进行扩展,找出最多的边。注意初始化等细节即可。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn = 505 ;
int boy ;
int girl ;
int edge ;
bool map[maxn][maxn] ;
int ug[maxn] ;
int ub[maxn] ;
int mk[maxn] ;
int dfs(int v) ;
int maxmatch() ;
int main()
{
//freopen("data.in" , "r" , stdin) ;
while(scanf("%d" , &edge)!=EOF && edge)
{
int i ;
int p ;
int q ;
scanf("%d%d" , &girl , &boy) ;
//注意初始化
memset(map , 0 , sizeof(map)) ;
for(i = 0 ; i < edge ; i ++)
{
scanf("%d%d" , &p , &q) ;
map[p][q] = 1 ;
}
printf("%d\n" , maxmatch()) ;
}
return 0;
}
int maxmatch()
{
int res ;
int i ;
res = 0 ;
memset(ug , -1 , sizeof(ug)) ;
memset(ub , -1 , sizeof(ub)) ;
for(i = 1 ; i <= girl ; i ++)
{
if(ug[i]==-1)
{
memset(mk , 0 , sizeof(mk)) ;
res += dfs(i) ;
}
}
return res ;
}
int dfs(int v)
{
int i ;
for(i = 1 ; i <= boy ; i ++)
{
if(map[v][i] && !mk[i])
{
mk[i] = 1 ;
if(ub[i]==-1 || dfs(ub[i]))
{
ug[v] = i ;
ub[i] = v ;
return 1 ;
}
}
}
return 0;
}