第一次接触图论,这个问题属于图论中的二分图最大匹配。
参考博客:趣写算法系列之–匈牙利算法
#include <bits/stdc++.h>
using namespace std;
int line[510][510],boy[510],used[510];
int k,m,n,a,b;
bool Find(int x){
for(int j=1;j<=n;j++){
if(line[x][j]==true && used[j]==false){
used[j]=1;
if(boy[j]==0||Find(boy[j])){
boy[j]=x;
return true;
}
}
}
return false;
}
int main(){
while(cin>>k&&k){
memset(line,0,sizeof(line));
memset(boy,0,sizeof(boy));
cin>>m>>n;
while(k--){
cin>>a>>b;
line[a][b]=1;
}
int sum=0;
for(int i=1;i<=m;i++){
memset(used,0,sizeof(used));
if(Find(i)) sum++;
}
cout<<sum<<endl;
}
return 0;
}