hdu2063

链接:点击打开链接

题意:输入数据的第一行是三个整数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;
}



你可能感兴趣的:(hdu2063)