hdu2063

来源:互联网 发布:电脑软件制作 编辑:程序博客网 时间:2024/06/01 07:19

链接:点击打开链接

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

代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int k,m,n;int rel[1005][1005],vis[505],girl[505];int hungarian(int x){               //rel代表男女关系,vis代表是否用过,girl代表女生的配哪一个男生        int i,j;    for(i=1;i<=m;i++){        if(rel[x][i]&&vis[i]==0){            vis[i]=1;            if(!girl[i]||hungarian(girl[i])){                girl[i]=x;                return 1;            }        }    }    return 0;}                                   //匈牙利算法模板        int main(){                         //就是二分图最大匹配    int i,sum,a,b;                  //推荐看这个博客写的通俗易懂        while(scanf("%d",&k)!=EOF&&k){  //http://blog.csdn.net/dark_scope/article/details/8880547        scanf("%d%d",&m,&n);        memset(rel,0,sizeof(rel));        memset(girl,0,sizeof(girl));        for(i=1;i<=k;i++){            scanf("%d%d",&a,&b);            rel[b][a]=1;        }        sum=0;        for(i=1;i<=n;i++){            memset(vis,0,sizeof(vis));            if(hungarian(i))            sum++;        }        printf("%d\n",sum);    }    return 0;}


0 0
原创粉丝点击