HDU 2063 过山车

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

二分图最大匹配,参照白书上邻接表建的图

View Code
#include <stdio.h>

#include <string.h>

const int MAX1=501;

const int MAX2=1001;

int k,m,n;

int match[MAX1];

int u[MAX2],v[MAX2];

int first[MAX1],next[MAX2];

int vis[MAX1];

int find(int ue)

{

    for(int e=first[ue];e!=-1;e=next[e])

        if(!vis[v[e]])

        {

            vis[v[e]]=1;

            if(match[v[e]]==-1||find(match[v[e]]))

            {

                match[v[e]]=ue;

                return 1;

            }

        }

    return 0;

}

int max_match()

{

    int ans=0;

    memset(match,-1,sizeof(match));

    for(int e=1;e<=m;e++)

    {

        memset(vis,0,sizeof(vis));

        ans+=find(e);

    }

    return ans;

}

void read_graph()

{

    memset(first,-1,sizeof(first));

    for(int e=0;e<k;e++)

    {

        scanf("%d%d",&u[e],&v[e]);

        next[e]=first[u[e]];

        first[u[e]]=e;

    }

}

int main()

{

    while(scanf("%d%d%d",&k,&m,&n),k)

    {

        read_graph();

        int ans=max_match();

        printf("%d\n",ans);

    }

    return 0;

}

 

你可能感兴趣的:(HDU)