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;
}

 

posted @ 2013-04-23 09:19  一线添  阅读(116)  评论(0编辑  收藏  举报