https://vjudge.net/problem/UVA-11138
提取题中数据:
#include<algorithm>
#include<cmath>
#include <stdio.h>
#define MAX_BOLTS 500
#define MAX_NUTS 500
using namespace std;
/*~global copy of the input data~*/
int nuts,bolts;
int mapp[MAX_BOLTS][MAX_NUTS];
void read_input_data(void)
{
int n,b;
scanf("%d%d",&bolts,&nuts);
for(b=0; b<bolts; b++)
{
for(n=0; n<nuts; n++)
{
scanf("%d",&mapp[b][n]);
}
}
}
/* data used to match nuts with bolts */
int nut_used[MAX_NUTS];
int nol_used[MAX_NUTS];
int index_num;
bool flag;
void init_match(void)
{
flag=false;
int n;
index_num=0;
for(n=0; n<nuts; n++)
nut_used[n]=0;
}
void match_bolt(int x, int y)
{
int n;
if(flag) return ;
if(x==bolts-1)
{
for(int i=0;i<nuts;++i)
{
if(mapp[x][i]&&!nut_used[i])
++y;
}
if(y>index_num)
index_num=y;
if(index_num==min(nuts,bolts))
flag=true;
return;
}
/* don’t match this bolt */
/*~match with all unused nuts that fit this bolt~*/
for(n=0; n<nuts; n++)
if(!nut_used[n] && mapp[x][n])
{
nut_used[n]=1;
match_bolt(x+1,y+1);
nut_used[n]=0;
}
}
int main()
{
int b,a;
scanf("%d",&b);
for(a=1; a<=b; a++)
{
read_input_data();//输入矩阵
init_match();
match_bolt(0,0);
printf("Case %d: ",a);
printf("a maximum of %d nuts and bolts ",index_num);
printf("can be fitted together\n");
}
return 0;
}
发现问题是一个botle只能放一个nut,1代表能放,0代表不能放,问可以放的最大的数量。
第一行选择中,有几个1就代表能与哪个螺母想配对.....以此类推。
问题改变为现在有两列数据,第一列代表的是螺栓的数量,第二列代表的是螺母的数量,每个螺母能够跟后面的多个螺栓进行匹配,问最大的匹配数量。
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=550;
vector<int>que[maxn];
int girl[maxn],used[maxn];
int ans;
int x,y,flag;
void initial()
{
for(int i=0;i<maxn;++i){
girl[i]=-1;
que[i].clear();
}
ans=0;
}
void readcase()
{
scanf("%d%d",&x,&y);
for(int i=1;i<=x;++i){
for(int j=1;j<=y;++j){
scanf("%d",&flag);
if(flag) que[i].push_back(j);
}
}
}
bool solve(int x)
{
for(int i=0;i<que[x].size();++i){
int to=que[x][i];
if(!used[to]){
used[to]=1;
if(girl[to]==-1||solve(girl[to])){
girl[to]=x;
return true;
}
}
}
return false;
}
void computing()
{
for(int i=1;i<=x;++i)
{
memset(used,0,sizeof(used));
if(solve(i))
ans++;
}
printf("a maximum of %d nuts and bolts can be fitted together\n" , ans);
}
int main()
{
int t;
scanf("%d",&t);
for(int i =1;i<=t; i++){
initial();
readcase();
printf("Case %d: ",i);
computing();
}
return 0;
}