hdu 2063 过山车(二分图最大匹配基础)

http://acm.hdu.edu.cn/showproblem.php?pid=2063

思路:

先给一个女生1找个对应的男生

再到下个女生2 如果这个女生找到的男生已经有对应的女生1

再找女生1的增广路

到最后得到最大匹配

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll __int64
#define MAXN 1000
#define INF 0x7ffffff
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int map[510][510];
int vis[2000];
int link[2000];
int k,w,m,ans;
int find(int x)
{
    int i;
    for(i=1;i<=m;i++)
    {
        if(!vis[i]&&map[x][i])
        {
            vis[i]=1;
            if(!link[i]||find(link[i]))
            {
                link[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,j;
    int na,nv;
    while(scanf("%d",&k)!=EOF&&k)
    {        
        scanf("%d%d",&w,&m);
        ans=0;
        mem(map,0);
        mem(link,0);
        for(i=1;i<=k;i++)
        {
            scanf("%d%d",&nv,&na);
            map[nv][na]=1;
        }
        
        for(i=1;i<=w;i++)
        {
            mem(vis,0);
            if(find(i)) ans++;
        }
        printf("%d
",ans);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/sola1994/p/3911565.html