二分图匹配入门题 hdu 2063

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
二分图匹配匈牙利算法详解:http://blog.csdn.net/dark_scope/article/details/8880547
做法:
感觉跟最大流差不多,所以挑战上也给出了一种方法建边,直接转换成最大流做。
主要就是一个找增广路。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define M 509
vector<int> G[M];
int n,m,k;
int match[M]; //女生所匹配的男生
bool used[M];
bool dfs(int u) //尝试给u这个男生匹配一个女生
{
    for(int i = 0;i < G[u].size();i++) //查找与这个男生所连接的女生
    {
        int v = G[u][i];
        if(!used[v]) //女生在该次寻找中是否试图修改过
        {
            used[v] = true;
            if(match[v] == -1 || dfs(match[v])) //如果这个女生还没有匹配男生,或者可以将与其匹配的男生换一个女生
            {
                match[v] = u;
                return true;
            }
        }
    }
    return false;
}
int bi()
{
    int res = 0;
    memset(match,-1,sizeof(match));
    for(int i = 1;i <= n;i++)//对每个男生进行查找,试图匹配一个女生
    {
        memset(used,0,sizeof(used));
        if(dfs(i)) res++;
    }
    return res;
}
int main()
{
    while(scanf("%d",&k) == 1)
    {
        if(k == 0) break;
        scanf("%d %d",&n,&m);
        for(int i = 0;i <= n;i++) G[i].clear();
        for(int i = 0;i < k;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            G[a].push_back(b);
        }
        printf("%d\n",bi());
    }
    return 0;
}

你可能感兴趣的:(二分图匹配入门题 hdu 2063)