const maxn=1001;
type node=^nd;
nd=record nam,c:longint; same,next:node; end;
var i,j,k,m,n,l,s,t:longint;
a,b,sp:array[0..maxn]of node;
q,lv,stack:array[0..maxn]of longint;
head,tail,max_flow,flow:longint;
p:node;
function bfs:boolean;
begin
fillchar(lv,sizeof(lv),$ff);
head:=0; tail:=1; q[1]:=s; lv[s]:=0;
while head<tail do
begin
inc(head);
p:=a[q[head]];
while p<>nil do
begin
if (lv[p^.nam]=-1)and(p^.c>0) then
begin
inc(tail); q[tail]:=p^.nam; lv[p^.nam]:=lv[q[head]]+1;
if p^.nam=t then exit(true);
end;
p:=p^.next;
end;
end;
exit(false);
end;
procedure dinic;
var i,j:longint;
begin
b:=a; head:=1; stack[head]:=s;
while head>0 do
begin
i:=stack[head];
if i<>t then
begin
while b[i]<>nil do
begin
if (lv[b[i]^.nam]=lv[i]+1)and(b[i]^.c>0) then break;
b[i]:=b[i]^.next;
end;
if b[i]<>nil then
begin inc(head); stack[head]:=b[i]^.nam; sp[head]:=b[i]; end
else begin dec(head); lv[i]:=-1; end;
end
else begin
flow:=maxlongint;
for i:=head downto 2 do
if sp[i]^.c<flow then flow:=sp[i]^.c;
for i:=head downto 2 do
begin
dec(sp[i]^.c,flow);
inc(sp[i]^.same^.c,flow);
if sp[i]^.c=0 then head:=i-1;
end;
inc(max_flow,flow);
end;
end;
end;
begin
while bfs do dinic;
writeln(max_flow);
end.
恩,就是加反向边