匈牙利算法, 敲难

在网上看到了一片比较好的文章http://blog.csdn.net/dark_scope/article/details/8880547

题目的大意就是尽可能多的为每一个男生去匹配女生 。

 

#include<cstdio>
#include<cstring>
#define N 500 + 10

using namespace std;

bool find(int x);

bool matrix[N][N] , link[N];
int boys[N];
int k , boy , girl , a , b , ans = 0;

int main()
{
    while(scanf("%d" , &k) && k)
    {
        scanf("%d%d" , &girl , &boy);

        memset(boys , 0 , sizeof(boys));
        for(int i=0; i<N; i++)
            memset(matrix[i] , 0 , sizeof(matrix[i]));
        for(int i=0; i<k; i++)
        {
            scanf("%d%d" , &a , &b);
            matrix[a][b] = 1;
        }

        for(int i=1; i<=girl; i++)
        {
            memset(link , 0 , sizeof(link));
            if(find(i))        ans++;
        }

        printf("%d\n" , ans);
        ans = 0;
    }

    return 0;
}

bool find(int x)
{
    for(int i=1; i<=boy; i++)
        if(matrix[x][i] && !link[i])
        {
            link[i] = 1;
            if(!boys[i] || find(boys[i]))
            {
                boys[i] = x;
                return true;
            }
        }

    return false;
}

 

posted on 2018-02-25 18:30  23~  阅读(204)  评论(0)    收藏  举报