ps:二分匹配法,匈牙利算法。感觉自己只是学了点皮毛...这里贴上大神的微博,深入浅出的讲了匈牙利算法:

http://blog.csdn.net/dark_scope/article/details/8880547

作者:Dark_Scope

贴上我写的AC代码:

#include "stdio.h"
#include "string.h"
#define true 10000000
#define false 10000001
int K,M,N;
int map[510][510];
int vis[510];
int pri[510];
int cal(int n);
int main(){
    int i,a,b,num;
    while(~scanf("%d",&K) && K){
        scanf("%d%d",&M,&N);
        memset(map,0,sizeof(map));
        for(i=1;i<=K;i++){
            scanf("%d%d",&a,&b);
            map[a][b]=1;
        }
        num=0;
        memset(pri,-1,sizeof(pri));
        for(i=1;i<=M;i++){
            memset(vis,0,sizeof(vis));
            if(cal(i)==true){
                num++;
            }
        }
        printf("%d\n",num);
    }
    return 0;
}
int cal(int n){
    int x,i;
    for(i=1;i<=N;i++){
        if(!vis[i] && map[n][i]){
            vis[i]=1;
            if(pri[i]==-1 || cal(pri[i])==true ){
                pri[i]=n;
                return true;
            }
        }
    }
    return false;
}