题意:中文题目
思路:匈牙利算法解决二分图最大匹配问题。
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 ",hungary()); 54 } 55 return 0; 56 }