PIGS网络流

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