题意:
有x个选手,每个选手有能接受的T恤号码,每种号码的T恤都有一定的数量,问是否有一种分配方案能让所有的选手都满意。
分析;
二分图的多重匹配问题,用匈牙利变形直接水。
代码:
//poj 2584
//sep9
#include <iostream>
using namespace std;
const int maxX=32;
const int maxY=8;
int cap[maxY],g[maxX][maxY],match[maxY][maxX];
int map[200],vis[maxY];
int x;
int dfs(int x)
{
int i,j;
for(i=1;i<=5;++i){
if(vis[i]==0&&g[x][i]==1){
vis[i]=1;
if(match[i][0]<cap[i]){
match[i][++match[i][0]]=x;
return 1;
}
else{
for(j=1;j<=match[i][0];++j)
if(dfs(match[i][j])==1){
match[i][j]=x;
return 1;
}
}
}
}
return 0;
}
int mulmatch()
{
int i,j;
for(i=1;i<=5;++i)
match[i][0]=0;
for(i=1;i<=x;++i){
memset(vis,0,sizeof(vis));
if(dfs(i)==0)
return 0;
}
return 1;
}
int main()
{
char s[32],tmp[8];
map['S']=1;map['M']=2;map['L']=3;map['X']=4;map['T']=5;
while(scanf("%s",s)==1){
if(s[0]=='E')
break;
int i,j;
memset(g,0,sizeof(g));
scanf("%d",&x);
for(i=1;i<=x;++i){
scanf("%s",tmp);
int a=map[tmp[0]],b=map[tmp[1]];
for(j=a;j<=b;++j)
g[i][j]=1;
}
for(i=1;i<=5;++i)
scanf("%d",&cap[i]);
scanf("%*s");
if(mulmatch()==1)
printf("T-shirts rock!\n");
else
printf("I'd rather not wear a shirt anyway...\n");
}
return 0;
}