题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
题意:中文题。
思路:这就是匈牙利算法算二分图最大匹配的算法,具体思想可以参考这个博客,我觉得很不错:http://blog.csdn.net/dark_scope/article/details/8880547
代码:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <numeric>
#include <set>
#include <string>
#include <cctype>
#include <sstream>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<LL, LL> P;
const int maxn = 1e5 + 5;
const int mod = 1e8 + 7;
int k,m,n;
int G[505][505];
int vis[505],used[505];
bool Find(int x){
for (int i=1;i<=n;i++){
if (!vis[i]&&G[x][i]){
vis[i]=1;
if (!used[i]||Find(used[i])){
used[i]=x;
return 1;
}
}
}
return 0;
}
int main() {
while (~scanf ("%d%d%d",&k,&m,&n)&&k){
memset(G,0,sizeof(G));
memset(used,0,sizeof(used));
while (k--){
int u,v;
scanf ("%d%d",&u,&v);
G[u][v]=1;
}
int ans=0;
for (int i=1;i<=m;i++){
memset(vis,0,sizeof(vis));
if (Find(i)) ans++;
}
printf ("%d\n",ans);
}
return 0;
}