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\n",ans);

    }

    return 0;

}

  

你可能感兴趣的:(HDU)