| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
pascalconst
maxn=210;
inf=1000000000;
type
edge=record
point,front,lim:longint;
end;
var
e:array[0..maxn*2] of edge;
head,cur,mark,q:array[0..maxn] of longint;
n,m,cnt,i,x,y,z,maxflow:longint;
function min(x,y:longint):longint; inline;
begin
if x>y then min:=y else min:=x;
end;
procedure addedge(x,y,z:longint); inline;
begin
inc(cnt); e[cnt].point:=y; e[cnt].lim:=z; e[cnt].front:=head[x]; head[x]:=cnt;
end;
function bfs:boolean;
var
i,h,t,u,p,po:longint;
begin
for i:=2 to n do mark[i]:=0;
h:=1; t:=1; q[1]:=1; mark[1]:=1;
while h<=t do
begin
u:=q[h]; p:=head[u]; cur[u]:=p;
while p>-1 do
begin
po:=e[p].point;
if (mark[po]=0) and (e[p].lim>0)
then
begin
mark[po]:=mark[u]+1;
inc(t); q[t]:=po;
end;
p:=e[p].front;
end;
inc(h);
end;
if mark[n]=0 then exit(false) else exit(true);
end;
procedure dinic(k,sum:longint);
var
p,po,temp:longint;
begin
if k=n then begin inc(maxflow,sum); exit; end;
if mark[k]=mark[n] then exit;
p:=cur[k];
while (p>-1) and (sum>0) do
begin
po:=e[p].point;
if (mark[po]=mark[k]+1) and (e[p].lim>0)
then
begin
temp:=maxflow;
dinic(po,min(sum,e[p].lim));
temp:=maxflow-temp;
dec(e[p].lim,temp);
inc(e[p xor 1].lim,temp);
dec(sum,temp);
end;
cur[k]:=p; p:=e[p].front;
end;
if sum>0 then cur[k]:=-1;
end;
begin
while not eof do
begin
readln(m,n);
cnt:=-1;
for i:=1 to n do head[i]:=-1;
for i:=1 to m do
begin
readln(x,y,z);
addedge(x,y,z);
addedge(y,x,0);
end;
maxflow:=0;
while bfs do dinic(1,inf);
writeln(maxflow);
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator