一开始居然忘添反向边……
Program P2516; const maxn=100; maxm=100; maxk=100; var n,m,k,i,j,l,maxflow:longint; need,prod:array[1..maxn,1..maxk] of longint; needk,prodk:array[1..maxk] of longint; fee:array[1..maxk,1..maxn,1..maxm] of longint; cost,map,f:array[0..200,0..200] of longint; b:array[0..200] of boolean; d,pre:array[0..200] of longint; q:array[1..500000] of 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 spfa; var i,j,l,h,t,now:longint; begin fillchar(d,sizeof(d),127); fillchar(b,sizeof(b),false); fillchar(pre,sizeof(pre),0); d[0]:=0; b[0]:=true; q[1]:=0; h:=1;t:=1; while h<=t do begin now:=q[h]; for i:=0 to n+m+1 do if (map[now,i]-f[now,i]>0) then if (d[now]+cost[now,i]<d[i]) then begin d[i]:=d[now]+cost[now,i]; pre[i]:=now; if not(b[i]) then begin b[i]:=true; inc(t); q[t]:=i; end; end; b[now]:=false; inc(h); end; end; function hllp:longint; var i,j,l,flow,totalflow,p:longint; totalcost,nowcost:longint; begin hllp:=0; totalflow:=0; totalcost:=0; while (true) do begin spfa; if d[n+m+1]=2139062143 then exit(totalcost); flow:=maxlongint; i:=n+m+1; repeat flow:=min(flow,map[pre[i],i]-f[pre[i],i]); i:=pre[i]; until i=0; nowcost:=0; i:=n+m+1; repeat inc(f[pre[i],i],flow); f[i,pre[i]]:=-f[pre[i],i]; inc(nowcost,cost[pre[i],i]); i:=pre[i]; until i=0; inc(totalcost,nowcost*flow); end; end; function main:longint; var i,j,l,s,t:longint; begin main:=0; for i:=1 to k do if prodk[i]<needk[i] then exit(-1); for i:=1 to k do begin fillchar(cost,sizeof(cost),0); fillchar(map,sizeof(map),0); fillchar(f,sizeof(f),0); s:=0; t:=n+m+1; for j:=1 to m do map[s,j]:=prod[j,i]; for j:=1 to n do map[m+j,t]:=need[j,i]; for j:=1 to m do for l:=1 to n do begin map[j,m+l]:=prod[j,i]; cost[j,m+l]:=fee[i,l,j]; cost[m+l,j]:=-cost[j,m+l]; end; main:=main+hllp; end; end; begin while not seekeof do begin read(n,m,k); if (n=0) and (m=0) and (k=0) then break; fillchar(needk,sizeof(needk),0); fillchar(prodk,sizeof(prodk),0); for i:=1 to n do for j:=1 to k do begin read(need[i,j]); inc(needk[j],need[i,j]); end; for i:=1 to m do for j:=1 to k do begin read(prod[i,j]); inc(prodk[j],prod[i,j]); end; for i:=1 to k do for j:=1 to n do for l:=1 to m do begin read(fee[i,j,l]); end; writeln(main); end; end.