POJ2584 T-Shirt Gumbo【二分图多重匹配】
2015-03-17 08:59
169 查看
题目链接:
http://poj.org/problem?id=2584
题目大意:
现在有5种型号(S、M、L、X、T)的衣服要发放给N个参赛队员。给出每个参赛者所需要衣服型号的范围。
在这个范围内的型号参赛者都能接受。再给出这5种型号衣服各自的数量,那么问题来了:是否存在一种
分配方案使得所有参赛队员都能够拿到自己型号范围内的衣服。
思路:
二分图匹配是一个对一个的匹配,这里是一对多匹配,需要用二分图多重匹配的模型来做。具体就是把原
先匈牙利算法中的cy[MAXN]更换为一个2维数组cy[MAXN][MAXN]。cy[i][j]表示与元素yi匹配的第j个元
素,同时用vey[i]来记录与元素yi匹配的元素的数量。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 33;
int Map[MAXN][MAXN];
bool Mask[MAXN];
int NX,NY,N;
int vcy[MAXN];
int cy[MAXN][MAXN];
int limit[MAXN];
bool FindPath(int u)
{
for(int i = 1; i <= 5; ++i)
{
if(Map[u][i] && !Mask[i])
{
Mask[i] = 1;
if(vcy[i] < limit[i])
{
cy[i][vcy[i]++] = u;
return true;
}
for(int j = 0; j < limit[i]; ++j)
{
if(FindPath(cy[i][j]))
{
cy[i][j] = u;
return true;
}
}
}
}
return false;
}
void MulMatch()
{
int Ans = 0;
memset(vcy,0,sizeof(vcy));
for(int i = 1; i <= N; ++i)
{
memset(Mask,0,sizeof(Mask));
Ans += FindPath(i);
}
if(Ans == N)
printf("T-shirts rock!\n");
else
printf("I'd rather not wear a shirt anyway...\n");
}
int main()
{
char s[20];
while(~scanf("%s",s))
{
if(strcmp(s,"ENDOFINPUT") == 0)
break;
scanf("%d",&N);
memset(Map,0,sizeof(Map));
for(int i = 1; i <= N; ++i)
{
scanf("%s",s);
char a = s[0];
char b = s[1];
int u,v;
if(a == 'S')
u = 1;
else if(a == 'M')
u = 2;
else if(a == 'L')
u = 3;
else if(a == 'X')
u = 4;
else if(a == 'T')
u = 5;
if(b == 'S')
v = 1;
else if(b == 'M')
v = 2;
else if(b == 'L')
v = 3;
else if(b == 'X')
v = 4;
else if(b == 'T')
v = 5;
for(int j = u; j <= v; ++j)
Map[i][j] = 1;
}
for(int i = 1; i <= 5; ++i)
scanf("%d",&limit[i]);
scanf("%s",s);
MulMatch();
}
return 0;
}
http://poj.org/problem?id=2584
题目大意:
现在有5种型号(S、M、L、X、T)的衣服要发放给N个参赛队员。给出每个参赛者所需要衣服型号的范围。
在这个范围内的型号参赛者都能接受。再给出这5种型号衣服各自的数量,那么问题来了:是否存在一种
分配方案使得所有参赛队员都能够拿到自己型号范围内的衣服。
思路:
二分图匹配是一个对一个的匹配,这里是一对多匹配,需要用二分图多重匹配的模型来做。具体就是把原
先匈牙利算法中的cy[MAXN]更换为一个2维数组cy[MAXN][MAXN]。cy[i][j]表示与元素yi匹配的第j个元
素,同时用vey[i]来记录与元素yi匹配的元素的数量。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 33;
int Map[MAXN][MAXN];
bool Mask[MAXN];
int NX,NY,N;
int vcy[MAXN];
int cy[MAXN][MAXN];
int limit[MAXN];
bool FindPath(int u)
{
for(int i = 1; i <= 5; ++i)
{
if(Map[u][i] && !Mask[i])
{
Mask[i] = 1;
if(vcy[i] < limit[i])
{
cy[i][vcy[i]++] = u;
return true;
}
for(int j = 0; j < limit[i]; ++j)
{
if(FindPath(cy[i][j]))
{
cy[i][j] = u;
return true;
}
}
}
}
return false;
}
void MulMatch()
{
int Ans = 0;
memset(vcy,0,sizeof(vcy));
for(int i = 1; i <= N; ++i)
{
memset(Mask,0,sizeof(Mask));
Ans += FindPath(i);
}
if(Ans == N)
printf("T-shirts rock!\n");
else
printf("I'd rather not wear a shirt anyway...\n");
}
int main()
{
char s[20];
while(~scanf("%s",s))
{
if(strcmp(s,"ENDOFINPUT") == 0)
break;
scanf("%d",&N);
memset(Map,0,sizeof(Map));
for(int i = 1; i <= N; ++i)
{
scanf("%s",s);
char a = s[0];
char b = s[1];
int u,v;
if(a == 'S')
u = 1;
else if(a == 'M')
u = 2;
else if(a == 'L')
u = 3;
else if(a == 'X')
u = 4;
else if(a == 'T')
u = 5;
if(b == 'S')
v = 1;
else if(b == 'M')
v = 2;
else if(b == 'L')
v = 3;
else if(b == 'X')
v = 4;
else if(b == 'T')
v = 5;
for(int j = u; j <= v; ++j)
Map[i][j] = 1;
}
for(int i = 1; i <= 5; ++i)
scanf("%d",&limit[i]);
scanf("%s",s);
MulMatch();
}
return 0;
}
相关文章推荐
- POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)
- hdu 3605 Escape/poj 2584 T-Shirt Gumbo(二分图多重匹配)
- POJ 2584 T-Shirt Gumbo(二分图最大匹配)
- PKU 2584 - T-Shirt Gumbo (二分图最大匹配 & 匈牙利算法 | 最大流 & EK)
- POJ2584 T-Shirt Gumbo【二分图多重匹配】
- POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
- POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
- POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)
- poj 2584 T-Shirt Gumbo 二分图多重匹配
- 二分图多重匹配
- 51Nod 2006:飞行员配对(二分图最大匹配,匈牙利算法)
- POJ 2536 Gopher II (二分图最大匹配)
- 二分图带权匹配、最佳匹配与KM算法
- 带权二分图的最优匹配 Kuhn-Munkres算法
- 二分图:最大独立集&最大匹配&最小顶点覆盖
- 杭电oj--2063 - 过山车【二分图最大匹配,匈牙利算法】
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配(转)
- poj 2584 T-Shirt Gumbo 二分匹配
- HDU 2444 The Accomodation of Students (二分图判定+最大匹配
- 二分图多重匹配--poj2289