S - 过山车

来源:互联网 发布:英语听力怎么练 知乎 编辑:程序博客网 时间:2024/04/29 13:35

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<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<vector>using namespace std;vector<int >match[505];int dis[505],vis[505]; int k,m,n,g,b,i;int dfs(int x){    for(int j=0;j<match[x].size();j++)//注意这里后面用了递归,所以要开局部变量    {        int val=match[x][j];        if(vis[val]==0)        {            vis[val]=1;            if(dis[val]==-1||dfs(dis[val]))//判断男生是否可以匹配女生,若男生未匹配,则该女生直接匹配,或者已经匹配了的女生能找到其他男生匹配            {                dis[val]=x;                return 1;            }        }    }    return 0;}int main(){    while(scanf("%d",&k),k)    {        scanf("%d%d",&n,&m);        int ans=0;        for(i=0;i<=n;i++)            match[i].clear();        while(k--)        {            scanf("%d%d",&g,&b);            match[g-1].push_back(b-1);//从0开始存,也可以从一开始存        }        memset(dis,-1,sizeof(dis));        for(i=0;i<n;i++)//遍历邻接表        {            memset(vis,0,sizeof(vis));//这个一定要写在里面,不然没法求增广路径            if(dfs(i)==1)                ans++;        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击