链接
题意:有n个猪圈,每个猪圈都有一定数量的猪,有m名顾客,他们想买一些猪圈的猪并且有确定的购买猪的数量
#include<stdio.h>
#include<string.h>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int mapp[110][110],vis[maxn];
int r[maxn],f[maxn];
const int inf=0x3f3f3f3f;
void EK(int L)
{
int i,j,k,l,flag,cur,sum=0;
while(1)
{
memset(vis,0,sizeof vis);
memset(f,0,sizeof f);
queue<int>q;
q.push(0);
r[0]=inf;
flag=1;
while(q.size()&&flag)
{
cur=q.front();
q.pop();
for(i=1;i<=L;i++)
{
if(!vis[i]&&mapp[cur][i]>0)
{
q.push(i);
vis[i]=1;
f[i]=cur;
r[i]=min(r[cur],mapp[cur][i]);
if(i==L)
{
flag=0;
break;
}
}
}
}
if(flag)
break;
for(i=L;i!=0;i=f[i])
{
mapp[f[i]][i]-=r[L];
mapp[i][f[i]]+=r[L];
}
sum+=r[L];
}
printf("%d\n",sum);
}
int main()
{
int n,m,i,j,k,l,pig[1010],p[1010];
while(~scanf("%d%d",&m,&n))
{
memset(mapp,0,sizeof mapp);
memset(p,0,sizeof p);
for(i=1;i<=m;i++)
scanf("%d",&pig[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&l);
while(l--&&scanf("%d",&k))
{
if(p[k]==0)
{
mapp[0][i]+=pig[k];
p[k]=i;
}
else
{
mapp[p[k]][i]=inf;
p[k]=i;
}
}
scanf("%d",&k);
mapp[i][n+1]=k;
}
EK(n+1);
}
return 0;
}