hdu(2063)(简单的二分匹配)
#include <iostream> #include <cstdio> #include <string.h> using namespace std; int sum,s[1005][1005],has[1005],link[1005],m,n,k; int match(int t) { for (int i=1;i<=n;++i) { if (!has[i]&&s[t][i])//注意不是s[i][t] { has[i]=1;//表示i号男生存在匹配 if (!link[i]||match(link[i]))//i号男生未匹配,或者i号男生所对应的女生可以找另一个对应 { link[i]=t; return 1; } } } return 0; } int main() { int i,a,b; while(scanf("%d",&k),k) { scanf("%d%d",&m,&n); memset(s,0,sizeof(s)); for (i=1;i<=k;++i) { scanf("%d%d",&a,&b); s[a][b]=1; } memset(link,0,sizeof(link)); sum=0; for (i=1;i<=m;++i) { memset(has,0,sizeof(has)); if (match(i)) ++sum; } printf ("%d\n",sum); } return 0; }