题目链接:
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; }