最大流的问题 设立一个源点为0 与衣服之间的容量为n/6 一个汇点 与志愿者之间的容量为1 志愿者与衣服之间容量为1
图建好了 套上模版就能AC
#include<cstdio>
#include<cstring>#include<queue>
using namespace std;
#define M 220
#define INF 1<<27
int n,m,s,t;
int flow[M][M],cap[M][M],a[M],p[M];
int bulid(char *s,int i)
{
if(!strcmp(s,"XXL"))
cap[m+1][i] = 1;
else if(!strcmp(s,"XL"))
cap[m+2][i] = 1;
else if(!strcmp(s,"L"))
cap[m+3][i] = 1;
else if(!strcmp(s,"M"))
cap[m+4][i] = 1;
else if(!strcmp(s,"S"))
cap[m+5][i] = 1;
else if(!strcmp(s,"XS"))
cap[m+6][i] = 1;
}
int bfs()
{
queue<int>q;
memset(flow,0,sizeof(flow));
int f = 0;
while(1)
{
memset(a,0,sizeof(a));
a[s] = INF;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int v = 0; v <= m+7; v++)
if(!a[v]&&cap[u][v]>flow[u][v])
{
p[v] = u;
q.push(v);
a[v] = min(a[u],cap[u][v]-flow[u][v]);
}
}
//printf("---%d\n",f);
if(!a[t]) break;
for(int u = t; u != 0; u = p[u])
{
flow[p[u]][u] += a[t];
flow[u][p[u]] -= a[t];
}
f += a[t];
}
return f;
}
int main()
{
int te;
scanf("%d",&te);
while(te--)
{
memset(cap,0,sizeof(cap));
memset(p,0,sizeof(p));
scanf("%d%d",&n,&m);
s = 0;
t = m+7;
for(int i = 1; i <= 6; i++)
{
cap[s][i+m] = n/6;
}
char s1[10],s2[10];
for(int i = 1; i <= m; i++)
{
cap[i][t] = 1;
scanf("%s %s",s1,s2);
bulid(s1,i);
bulid(s2,i);
}
if(bfs()<m)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}