第一次接触图论,这个问题属于图论中的二分图最大匹配。 参考博客:趣写算法系列之–匈牙利算法
#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; }