UVA 11045-My T-shirt suits me(二分图匹配)

本文探讨了在给定数量的T恤和人员需求下,如何使用二分图匹配解决分配问题,确保所有人都能得到合适的T恤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:有N件T恤,N是6的倍数,因为有6种型号,每种件数相同,有M个人,每个人有两种型号的T恤适合他,每个人可以挑其中的一种,问能否所有的人都能分配到T恤。

解析:典型的二分图匹配,每N/6为同种T恤,对于单个人,将他与它适合的两种T恤的所有标号连边,最后计算最大匹配,如果小于M,则不可行,否则可行。

代码如下:

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
vector<int> G[40];
int le[40],ri[40];
int N,M;
string type[]={"S","M","L","XS","XL","XXL"}; //6种型号的T恤
bool vis[40];
bool dfs(int cur)    //二分图匹配模板
{
    if(vis[cur])  return false;
    vis[cur]=true;
    for(int i=0;i<G[cur].size();i++)
    {
        int to=G[cur][i];
        if(ri[to]==-1||dfs(ri[to]))
        {
            le[cur]=to;
            ri[to]=cur;
            return true;
        }
    }
    return false;
}
bool Match()
{
    int ret=0;
    memset(le,-1,sizeof(le));
    memset(ri,-1,sizeof(ri));
    for(int i=1;i<=N;i++)
    {
        memset(vis,false,sizeof(vis));
        if(dfs(i))  ret++;   //如果能匹配,则加1
        if(ret==M)  return true;  //达到M,直接返回真
    }
    return false;
}
int main()
{
    int T;
    cin>>T;
    map<string,int> ma;
    for(int i=0;i<6;i++)  ma[type[i]]=i;   //将T恤型号映射成编号
    while(T--)
    {
        cin>>N>>M;
        for(int i=1;i<=N;i++)  G[i].clear();
        

转载于:https://www.cnblogs.com/wust-ouyangli/p/4744227.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值