最大流Dinic算法模板(pascal)

 1 program rrr(input,output);
 2 const
 3   inf=123456789;
 4 type
 5   pointer=^nodetype;
 6   nodetype=record
 7      t,c:longint;
 8      next,rev:pointer;
 9   end;
10 var
11   a,cur:array[0..10010]of pointer;
12   d,q:array[0..10010]of longint;
13   p:pointer;
14   i,n,m,s,t,c,x,y,ans:longint;
15 function min(a,b:longint):longint;
16 begin
17    if a<b then exit(a) else exit(b);
18 end;
19 procedure add(x,y,c:longint);
20 begin
21    new(p);p^.t:=y;p^.c:=c;p^.next:=a[x];a[x]:=p;
22 end;
23 procedure bfs;
24 var
25   h,t:longint;
26 begin
27    for i:=1 to n do d[i]:=-1;
28    h:=1;t:=1;q[1]:=s;d[s]:=0;
29    while h<=t do
30       begin
31          p:=a[q[h]];
32          while p<>nil do
33             begin
34                if (d[p^.t]=-1) and (p^.c>0) then
35                   begin
36                      d[p^.t]:=d[q[h]]+1;
37                      inc(t);q[t]:=p^.t;
38                   end;
39                p:=p^.next;
40             end;
41          inc(h);
42       end;
43 end;
44 function dfs(k,f:longint):longint;
45 var
46   ans,r:longint;
47   p:pointer;
48 begin
49    if (k=t) or (f=0) then exit(f);
50    ans:=0;
51    p:=cur[k];
52    while p<>nil do
53       begin
54          if (d[p^.t]=d[k]+1) and (p^.c>0) then
55             begin
56                r:=dfs(p^.t,min(f,p^.c));
57                p^.c:=p^.c-r;
58                p^.rev^.c:=p^.rev^.c+r;
59                f:=f-r;
60                ans:=ans+r;
61                if f=0 then break;
62             end;
63          p:=p^.next;
64          cur[k]:=p;
65       end;
66    if f>0 then d[k]:=-1;
67    exit(ans);
68 end;
69 begin
70    assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
71    readln(n,m,s,t);
72    for i:=1 to n do a[i]:=nil;
73    for i:=1 to m do
74       begin
75          readln(x,y,c);
76          if x=y then continue;
77          add(x,y,c);add(y,x,0);
78          a[x]^.rev:=a[y];a[y]^.rev:=a[x];
79       end;
80    ans:=0;
81    while true do
82       begin
83          bfs;
84          if d[t]=-1 then break;
85          for i:=1 to n do cur[i]:=a[i];
86          ans:=ans+dfs(s,inf);
87       end;
88    write(ans);
89    close(input);close(output);
90 end.

 

posted @ 2017-02-10 19:48  Klaier  阅读(263)  评论(0编辑  收藏  举报