hdu 2063 过山车

来源:互联网 发布:sql root password 编辑:程序博客网 时间:2024/05/22 00:22

 过山车
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
 

Input

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

Output

对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
 

Sample Input

6 3 31 11 21 32 12 33 10
 

Sample Output

3
 


#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;#define maxn 5005#define inf 0x3f3f3f3fint first[maxn],nxt[maxn],to[maxn],e;int vis[maxn],linker[maxn];int k,m,n;void addedge(int u,int v){    to[e]=v;    nxt[e]=first[u];    first[u]=e++;}bool dfs(int u){    for(int i=first[u];~i;i=nxt[i]){        int v=to[i];        if(!vis[v]){            vis[v]=1;            if(linker[v]==-1||dfs(linker[v])){                linker[v]=u;                return true;            }        }    }    return false;}int match(){    memset(linker,-1,sizeof linker);    int ans=0;    for(int i=1;i<=n;i++){        memset(vis,0,sizeof vis);        if(dfs(i))ans++;    }    return ans;}int main(){    int u,v;    //freopen("in.txt","r",stdin);    while(~scanf("%d",&k)&&k){        scanf("%d%d",&m,&n);        e=0;        memset(first,-1,sizeof first);        for(int i=1;i<=k;i++){            scanf("%d%d",&u,&v);           // addedge(u,v);        //从u向v连边,则在u这边开始挑选            addedge(v,u);          <span style="font-family: Arial, Helvetica, sans-serif;">//从v向u连边,则在v这边开始挑选</span>        }        printf("%d\n",match());    }}


0 0