题目地址:http://acm.fzu.edu.cn/problem.php?pid=2039
很典型的二分匹配,匈牙利算法,不再赘述
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
//#include<map>
using namespace std;
void rw();
int n,m,e,map[111][111];
int Link[111];
int vis[111];
void init()
{
memset(map,-1,sizeof(map));
scanf("%d%d%d",&n,&m,&e);
int u,v;
for(int i=0;i<e;i++)
{
scanf("%d%d",&u,&v);
map[u][v]=0;
}
}
bool can(int x)
{
for(int i=1;i<=m;i++)
{
if(!vis[i]&&map[x][i]==-1)
{
vis[i]=1;
if(Link[i]==-1||can(Link[i]))
{
Link[i]=x;
return true;
}
}
}
return false;
}
void solve(int k)
{
memset(Link,-1,sizeof(Link));
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(can(i))
ans++;
}
printf("Case %d: %d\n",k,ans);
}
int main()
{
int Case;
scanf("%d",&Case);
for(int i=1;i<=Case;i++)
{
init();
solve(i);
}
return 0;
}