内容目录
EK……
Program P1149; var i,j,k,n,m,p:longint; map,f:array[0..500,0..500] of longint; visit,e,pre,pighouse:array[0..500] of longint; maxflow:longint; function min(a,b:longint):longint; begin if a<b then exit(a) else exit(b); end; function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; procedure edmons_karp; var i,j:longint; h,t:longint; queue:array[1..500] of longint; begin maxflow:=0; while (true) do begin fillchar(pre,sizeof(pre),0); fillchar(e,sizeof(e),0); queue[1]:=0; e[0]:=maxlongint; h:=1; t:=1; while h<=t do begin for i:=1 to n+1 do if (map[queue[h],i]-f[queue[h],i]>0) and (e[i]=0) then begin e[i]:=min(e[queue[h]],map[queue[h],i]-f[queue[h],i]); pre[i]:=queue[h]; inc(t); queue[t]:=i; end; if e[n+1]>0 then break; inc(h); end; if (e[n+1]=0) then break; i:=n+1; while (true) do begin inc(f[pre[i],i],e[n+1]); f[i,pre[i]]:=-f[pre[i],i]; if i=0 then break; i:=pre[i]; end; inc(maxflow,e[n+1]); end; end; begin read(m,n); fillchar(visit,sizeof(visit),0); fillchar(f,sizeof(f),0); fillchar(map,sizeof(map),0); fillchar(e,sizeof(e),0); for i:=1 to m do read(pighouse[i]); for i:=1 to n do begin read(k); for j:=1 to k do begin read(p); if (visit[p]=0) then begin map[0,i]:=map[0,i]+pighouse[p]; visit[p]:=i; end else begin map[visit[p],i]:=maxlongint; end; end; read(p); map[i,n+1]:=p; end; edmons_karp; writeln(maxflow); end.