题意:中文题目
思路:匈牙利算法解决二分图最大匹配问题。
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N=505;
4 int mapp[N][N]; //矩阵
5 int girl[N]; //记录该女已分配的男编号
6 int vis[N]; //标记是否已经尝试为其另分配
7 int n, a, b, k, m;
8
9 int find(int x)
10 {
11 for(int i=1; i<=m; i++) //扫描所有妹子
12 {
13 if(mapp[x][i]&&!vis[i]) //有暧昧,未尝试为其另分配
14 {
15 vis[i]=1; //已尝试
16 if( !girl[i] || find(girl[i]) )
17 {
18 girl[i]=x;
19 return true;
20 }
21 }
22 }
23 return false;
24 }
25
26 int hungary()
27 {
28 int cnt=0;
29 for(int i=1; i<=n; i++)
30 {
31 memset(vis,0,sizeof(vis));
32 if(find(i)) cnt++;
33 }
34 return cnt;
35 }
36
37 int main()
38 {
39 freopen("input.txt", "r", stdin);
40
41 while(scanf("%d",&k), k)
42 {
43 memset(vis,0,sizeof(vis));
44 memset(mapp,0,sizeof(mapp));
45 memset(girl,0,sizeof(girl));
46 scanf("%d%d",&m,&n);
47
48 for(int i=0; i<k; i++) //2分图
49 {
50 scanf("%d%d",&b,&a);
51 mapp[a][b]=1;
52 }
53 printf("%d\n",hungary());
54 }
55 return 0;
56 }
AC代码
作者:xcw0754