hdu2063 二分图(基础题)

这个题目适合刚刚接触二分图的同学做哦:

       

给一个题目链接 点击打开链接

题目大意,有K个男女匹配方式, 输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。

输出最大的男女匹配对数,匹配方式为,一个男生匹配一个女生;


         题目思路

      先让1与能匹配到的男生进行匹配,用一个数组记录与该男生匹配的女生是谁?  

如果该男生没有匹配直接匹配,即可。

如果该男生已经被摸个女生匹配,就让该男生匹配女生重新进行匹配。

否则 ,表示该女生匹配不到人。



      这个题目是 裸的二分图 直接用模板,

 算法是:  匈牙利算法

#include<iostream>
#include<string.h>
#include<cstdio>

using namespace std;
const int MM=505;
bool adjmat[MM][MM],vis[MM];
int boy_s_girl[MM];
int k,girl,boy;

int pipei(int people) //需要进行匹配的女生
{
    int i;
    for(i=1;i<=boy;i++)  // 男生
    {
        if(adjmat[people][i]&&!vis[i]) // 如果该女生可以与该男生匹配 且该男生未被匹配
        {
            vis[i]=1;
            if(boy_s_girl[i]==0||pipei(boy_s_girl[i])) // 如果该男生未被匹配 ,或者
            // 继续找该男生匹配到女生除他以外的其他男生
            {
                boy_s_girl[i]=people;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int ans;
    while(scanf("%d",&k)!=EOF&&k)
    {
        scanf("%d %d",&girl,&boy);
        int i;
        memset(adjmat,0,sizeof(adjmat));
        memset(boy_s_girl,0,sizeof(boy_s_girl));
        ans=0;
        for(i=0;i<k;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            adjmat[a][b]=true;
        }
        for(i=1;i<=girl;i++)
        {
            memset(vis,0,sizeof(vis));
            ans+=pipei(i);
        }
        cout<<ans<<endl;
    }
    return 0;
}
       

posted @ 2016-05-13 12:15  Code-dream  阅读(143)  评论(0编辑  收藏  举报