最大流 poj 1149 pigs
http://poj.org/problem?id=1149
http://imlazy.ycool.com/post.2059102.html 大牛的见图详解。
#include<iostream>
#include<queue>
using namespace std;
#define INF 0x7fffffff
#define maxn 1100
#define maxe 100010
typedef struct
{
int v,val,next;
}Edge;
Edge e[maxe];
int idx,S,T;
int bild[maxn],h[maxn],pre[maxn],pig[maxn];
bool bfs()
{
int i,v,val,u;
queue<int>Q;
memset(h,-1,sizeof(h));
Q.push(S),h[S]=0;
while(!Q.empty())
{
u=Q.front(),Q.pop();
for(i=pre[u];i!=-1;i=e[i].next)
{
v=e[i].v;
val=e[i].val;
if(val>0&&h[v]==-1)
{
h[v]=h[u]+1;
if(v==T) return true;
Q.push(v);
}
}
}
return false;
}
int MIN(int a,int b) { return a<b?a:b; }
int dfs(int u,int flow)
{
if(u==T||flow==0) return flow;
int i,ret,v,ans=0;
for(i=pre[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(e[i].val>0&&h[v]==h[u]+1)
{
ret=dfs(v,MIN(flow,e[i].val));
if(ret>0)
{
e[i].val-=ret;
e[i^1].val+=ret;
ans+=ret;
flow-=ret;
}
}
}
return ans;
}
void dinic()
{
int ans=0;
while(bfs())
ans+=dfs(S,INF);
printf("%d\n",ans);
}
void add(int from,int to,int valT,int valF)
{
e[idx].v=to;
e[idx].val=valT;
e[idx].next=pre[from];
pre[from]=idx++;
e[idx].v=from;
e[idx].val=valF;
e[idx].next=pre[to];
pre[to]=idx++;
}
int main()
{
int m,n;
int i,a,k,j;
while(scanf("%d%d",&m,&n)==2)
{
for(i=1;i<=m;i++) scanf("%d",&pig[i]);
memset(bild,0,sizeof(bild)),memset(pre,-1,sizeof(pre));
S=0,T=n+1,idx=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
for(j=1;j<=a;j++)
{
scanf("%d",&k);
if(bild[k]) add(bild[k],i,INF,0);
else
add(S,i,pig[k],0);
bild[k]=i;
}
scanf("%d",&a);
add(i,T,a,0);
}
dinic();
}
return 0;
}