标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 61571 | Accepted: 23621 |
Description
Input
Output
Sample Input
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
Sample Output
50
题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条水渠,给出这n条水渠所连接的点和所能流过的最大流量,求从源点到汇点能流过的最大流量。(网络流模板题)
代码:
type
node=record
y,r,next,op:longint;
end;
var
g:array [1..400] of node;
h,level,q:array [1..400] of longint;
i,j,m,n,ans,a,b,c,vs,vt,tot:longint;
function min(x,y:longint):longint;
begin
if x<y then
exit(x);
exit(y);
end;
function dfs(v,a:longint):longint;
var
tmp,u,ans,value,flow:longint;
begin
if (v=vt) or (a=0) then exit(a);
ans:=0;
tmp:=h[v];
while tmp<>-1 do
begin
u:=g[tmp].y;
value:=g[tmp].r;
if level[v]+1=level[u] then
begin
flow:=dfs(u,min(a,value));
if flow<>0 then
begin
g[tmp].r:=g[tmp].r-flow;
g[g[tmp].op].r:=g[g[tmp].op].r+flow;
ans:=ans+flow;
a:=a-flow;
if a=0 then break;
end;
end;
tmp:=g[tmp].next;
end;
exit(ans);
end;
function bfs:boolean;
var
u,tmp,l,f,v:longint;
begin
fillchar(level,sizeof(level),0);
q[1]:=vs;
level[vs]:=1;
l:=1;
f:=1;
repeat
v:=q[l];
tmp:=h[v];
while tmp<>-1 do
begin
u:=g[tmp].y;
if (g[tmp].r<>0) and (level[u]=0) then
begin
level[u]:=level[v]+1;
inc(f);
q[f]:=u;
if u=vt then exit(true);
end;
tmp:=g[tmp].next;
end;
inc(l);
until l>f;
exit(false);
end;
procedure add(a,b,c:longint);
begin
inc(tot);
g[tot].y:=b;
g[tot].r:=c;
g[tot].next:=h[a];
h[a]:=tot;
g[tot].op:=tot+1;
inc(tot);
g[tot].y:=a;
g[tot].r:=0;
g[tot].next:=h[b];
h[b]:=tot;
g[tot].op:=tot-1;
end;
begin
while not eof do
begin
fillchar(g,sizeof(g),0);
fillchar(h,sizeof(h),$ff);
fillchar(level,sizeof(level),0);
fillchar(q,sizeof(q),0);
readln(n,m);
tot:=0;
ans:=0;
vs:=1;
vt:=m;
for i:=1 to n do
begin
readln(a,b,c);
add(a,b,c);
end;
while bfs do
ans:=ans+dfs(vs,maxlongint);
writeln(ans);
end;
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/boyxiejunboy/article/details/46890379