| 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