题目链接地址:
http://acm.hdu.edu.cn/showproblem.php?pid=2063
代码如下:
/*
* File: main.cpp
* Author: mtttt
*
* Created on 2010年3月21日, 下午5:57
*/
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
using namespace std;
/*
* 二分匹配问题
*/
int n,m,l;//男生,女生人数,多少组合
bool used[501]; // 记录女生是否已经配对
int link[501];//记录当前与男生相连的女生
bool mat[501][501];//记录连接女生和男生的边
void input()
{
int x,y;
scanf("%d %d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
mat[i][j]=false;
for(int i=1;i<=l;i++)
{
scanf("%d %d",&x,&y);
mat[x][y]=true;
}
return ;
}
bool can(int t)
{
for(int j=1;j<=m;j++)
{
if(!used[j]&&mat[j][t])
{
used[j]=true;
if(link[j]==-1||can(link[j]))
{
link[j]=t;
return true;
}
}
}
return false;
}
void solve()
{
int num=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
if(can(i)) num++;
}
cout<<num<<endl;
}
int main(int argc, char** argv) {
// freopen("1.in","r",stdin);
while(scanf("%d",&l)&&l)
{
input();
solve();
}
return 1;
}
就是不断的找增广路径