向总等编写的《奥赛经典·提高篇》上所给出的基本模板有误,现在把正确的模板贴上来。
Program MinCostMaxFlow;//By_Thispoet Var c,f,cost :Array[0..100,0..100]of Longint; a,b,ct :Array[0..100]of Longint; ans :Longint; i,j,k,m,n,p,q :Longint; seq :Array[1..10000]of Longint; h,t :Longint; v :Array[0..100]of Boolean; Function Min(i,j:Longint):Longint; begin if i<j then exit(i);exit(j); end; BEGIN readln(n,m); for i:=1 to m do begin read(j,k); readln(c[j,k],cost[j,k]); end; Repeat fillchar(v,sizeof(v),0); fillchar(ct,sizeof(ct),127); ct[0]:=0; v[0]:=true; a[0]:=-1;b[0]:=maxlongint; h:=0;t:=1;seq[1]:=0; while h<t do begin inc(h);k:=seq[h]; for i:=1 to n+1 do if (f[k,i]<c[k,i])and(c[k,i]>0)and(ct[i]>ct[k]+cost[k,i])then begin inc(t);seq[t]:=i; a[i]:=k;b[i]:=Min(b[k],c[k,i]-f[k,i]); ct[i]:=ct[k]+cost[k,i]; v[i]:=true; end else if (c[i,k]>0)and(f[i,k]>0)and(ct[i]>ct[k]-cost[i,k])then begin inc(t);seq[t]:=i; a[i]:=k;b[i]:=Min(b[k],f[i,k]); ct[i]:=ct[k]-cost[i,k]; v[i]:=true; end; end; if v[n+1] then begin i:=n+1; while a[i]<>-1 do begin if (c[i,a[i]]>0)and(f[i,a[i]]>0) then begin dec(f[i,a[i]],b[n+1]); dec(ans,cost[i,a[i]]*b[n+1]); end else begin inc(f[a[i],i],b[n+1]); inc(ans,b[n+1]*cost[a[i],i]); end; i:=a[i]; end; end; Until not v[n+1]; writeln(ans); END.