您的位置:首页 > 其它

hdu2603

2013-07-29 13:26 429 查看
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M=2001;
int k,m,n;
vector<int> v[M];
int mat[M];
bool mark[M];
void delete_(int m)
{
for(int i=0;i<m;i++)
{
v[i].clear();
mark[i]=0;
mat[i]=-1;
}
}
bool find_(int i)
{
for(int j=0;j<v[i].size();j++)
{
if(!mark[v[i][j]])
{
mark[v[i][j]]=1;
if(mat[v[i][j]]==-1||find_(mat[v[i][j]]))
{
mat[v[i][j]]=i;
return 1;
}
}
}
return 0;
}
int Hungary(int n)
{
int max=0;
for(int i=0;i<n;i++)
{
if(find_(i))max++;
for(int j=0;j<n;j++)mark[j]=0;
}
return max;
}

int main()
{
while(cin>>k,k)
{
cin>>m>>n;
delete_(m>n?m:n);
for(int i=0,x,y;i<k;i++)
{
cin>>x>>y;
v[x-1].push_back(y-1);
}
cout<<Hungary(m>n?m:n)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分图