#include "stdio.h" //poj 1149 最大流
#include "string.h"
#include "queue"
using namespace std;
#define N 2250
#define INF 0x3fffffff
struct node
{
int u,v,w;
int next;
}edge[8*N];
int n,idx;
int start,end;
int route[N],maxf[N],head[N],last[N];
int EK();
int BFS();
void init();
void adde(int u,int v,int w);
void addedge(int u,int v,int w);
int MIN(int x,int y){ return x<y?x:y;}
int main()
{
int m,k;
int i,j;
int u,v,w,Case;
while(scanf("%d %d",&m,&k)!=-1)
{
init();
start = 0; //超级源点
end = m+k+1; //超级汇点
for(n=1;n<=m;n++)
{
scanf("%d",&w);
adde(start,n,w);
last[n] = n;
}
n=m;
for(i=1;i<=k;i++)
{
n++;
scanf("%d",&Case);
while(Case--)
{
scanf("%d",&v);
adde(last[v],n,INF);
last[v] = n;
}
scanf("%d",&w);
adde(n,end,w);
}
int ans = EK();
printf("%d\n",ans);
}
return 0;
}
void init()
{
idx = 0;
memset(head,-1,sizeof(head));
}
void adde(int u,int v,int w)
{
addedge(u,v,w);
addedge(v,u,0);
}
void addedge(int u,int v,int w)
{
edge[idx].u = u;
edge[idx].v = v;
edge[idx].w = w;
edge[idx].next = head[u];
head[u] = idx;
idx++;
}
int EK()
{
int ans=0,kejia;
int x,y;
while(kejia = BFS())
{
ans += kejia;
y = route[end];
while(y!=-1)
{
x = y^1;
edge[y].w -= kejia;
edge[x].w += kejia;
y = route[edge[y].u];
}
}
return ans;
}
int BFS()
{
int i;
int x,y;
memset(route,-1,sizeof(route));
for(i=0;i<N;i++) maxf[i] = INF;
route[0] = 0;
queue<int> q;
q.push(start);
while(!q.empty())
{
x = q.front();
q.pop();
for(i=head[x];i!=-1;i=edge[i].next)
{
y = edge[i].v;
if(route[y]==-1 && edge[i].w>0)
{
maxf[y] = MIN(maxf[x],edge[i].w);
route[y] = i;
q.push(y);
}
}
}
route[0] = -1;
if(route[end]==-1) return 0;
return maxf[end];
}
//http://www.cnblogs.com/rainydays/archive/2011/08/27/2155710.html
poj 1149 PIGS 最大流
最新推荐文章于 2024-10-03 23:25:47 发布