2话不说 贴代码: program maxflow; type node=^pp; pp=record num:longint; dad,son:node; end; var g,t:array[0..100000,0..3000] of longint;//g为残量网络,t为每个结点边的集合 level,m,mind,sp,x,y,i,j,n,s,q,c:longint;//level是当前最大标号 d,tot,e:array[0..500]of longint;//e为节点盈余,tot为节点边的数目,d为距离标号 link:array[0..500]of node;//link[k]存放所有d为k的活跃结点 ps:node; move:boolean; procedure dis;//初始化距离标号 var s:longint; list:array[0..500]of longint; v:Array[0..500]of boolean; begin fillchar(v,sizeof(v),false); list[1]:=n; v[n]:=true; s:=1; for i:=1 to n do begin x:=list[i]; for j:=1 to tot[x] do begin y:=t[x,j]; if (g[y,x]>0)and(not v[y]) then begin v[y]:=true; d[y]:=d[x]+1; inc(s); list[s]:=y; end; end; if d[1]>0 then break; end; end; procedure del(p:node);//从link表中删除一个结点 begin p^.dad^.son:=p^.son; if p^.son<>nil then p^.son^.dad:=p^.dad; dispose(p); end; procedure add(k,s:longint);//把s结点添加到link[k] var ps:node; begin ps:=link[k]; while ps^.son<>nil do ps:=ps^.son; new(ps^.son);ps^.son^.dad:=ps; ps^.son^.son:=nil; ps:=ps^.son; ps^.num:=s; end; procedure moves(p:node;a:longint);//把结点p移动到link[a] var k:longint; begin k:=p^.num; del(p); add(a,k); end; procedure push(a,b:integer);//从a向b推进 var ps:node; k:longint; begin if g[a,b]>e[a] then k:=e[a] else k:=g[a,b]; if (e[b]=0)and(b<>1)and(b<>n) then add(d[b],b); inc(e[b],k); dec(e[a],k); dec(g[a,b],k); inc(g[b,a],k); end; begin assign(input,'maxflow.in');reset(input); assign(output,'maxflow.out');rewrite(output); readln(n,m); for i:=1 to m do begin readln(s,q,c); g[s,q]:=c; inc(tot[s]); t[s,tot[s]]:=q; inc(tot[q]); t[q,tot[q]]:=s; end; dis; for i:=1 to n+1 do begin new(link[i]); link[i]^.son:=nil; link[i]^.dad:=nil; end; d[1]:=n; x:=1; for i:=1 to tot[1] do begin y:=t[x,i]; g[y,x]:=g[x,y]; g[x,y]:=0; e[y]:=g[y,x]; add(d[y],y); if d[y]>level then level:=d[y]; end; while level>0 do begin while (level>0)and(link[level]^.son=nil) do dec(level); if level=0 then break; x:=link[level]^.son^.num; sp:=0;mind:=n;move:=false; for i:=1 to tot[x] do begin y:=t[x,i]; if (d[y]>=d[x])and(d[y]<mind)and(g[x,y]>0) then begin mind:=d[y]; sp:=y; end; if d[y]+1=d[x] then begin push(x,y); if e[x]=0 then begin move:=true; del(link[level]^.son); break; end; end; end; if not move then begin ps:=link[level]^.son; level:=mind+1; d[x]:=level; moves(ps,level); end; end; writeln(e[n]); close(input); close(output); end.