您的位置:首页 > 其它

hdu2063

2015-08-23 18:35 274 查看
链接:点击打开链接

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: