道路修建 (网络流)

  1 const INF=2000000000;
  2 const maxn=4008;
  3 var r:array[0..maxn] of longint;
  4     eg:array[0..1000008] of record u,v,w,nt:longint; end;
  5     el:longint;
  6     lt:array[0..maxn] of longint;
  7     h:array[0..maxn] of longint;
  8     b:array[0..10008] of longint;
  9     i,j,k,n,s,t,m,x,y:longint;
 10 function op(i,j:longint):longint; inline;
 11 begin
 12     exit((i-1)*n+j);
 13 end;
 14 function calc(x,y:longint):longint; inline;
 15 begin
 16     exit(trunc(10*ln(233*(x-y)*(x-y)+1)));
 17 end;
 18 procedure adt(u,v,w:longint);
 19 begin
 20     inc(el);
 21     eg[el].u:=u;
 22     eg[el].v:=v;
 23     eg[el].w:=w;
 24     eg[el].nt:=lt[u];
 25     lt[u]:=el;
 26 end;
 27 procedure add(u,v,w:longint);
 28 begin
 29      //   writeln(u,' ',v,' ',w);
 30     adt(u,v,w); adt(v,u,0);
 31 end;
 32 procedure bfs;
 33 var i,l,r,x:longint;
 34 begin
 35     fillchar(h,sizeof(h),$7f);
 36     h[t]:=0;
 37     l:=1; r:=1; b[1]:=t;
 38     while l<=r do
 39     begin
 40         x:=b[l];
 41         i:=lt[x];
 42         while i<>0 do
 43         begin
 44             if (h[eg[i].v]>=n) and (eg[i xor 1].w>0) then
 45             begin
 46                 inc(r);
 47                 b[r]:=eg[i].v;
 48                 h[eg[i].v]:=h[x]+1;
 49             end;
 50             i:=eg[i].nt;
 51         end;
 52         inc(l);
 53     end;
 54 end;
 55 function min(a,b:longint):longint; inline;
 56 begin
 57     if a<b then exit(a) else exit(b);
 58 end;
 59 function dfs(u,inl:longint):longint;
 60 var i,v,outl:longint;
 61 begin
 62     if u=t then exit(inl);
 63     dfs:=0;
 64     i:=lt[u];
 65     while i<>0 do
 66     begin
 67         v:=eg[i].v;
 68         if (eg[i].w>0) and (h[u]=h[v]+1) then
 69         begin
 70             outl:=dfs(v,min(eg[i].w,inl));
 71             dec(inl,outl);
 72             inc(dfs,outl);
 73             dec(eg[i].w,outl);
 74             inc(eg[i xor 1].w,outl);
 75             if inl=0 then break;
 76         end;
 77         i:=eg[i].nt;
 78     end;
 79     if inl=0 then h[u]:=-1;
 80 end;
 81 function dinic:longint;
 82 var sum:longint;
 83 begin
 84     bfs;
 85     sum:=0;
 86     while h[s]<n do
 87     begin
 88         sum:=sum+dfs(s,INF);
 89         bfs;
 90         //writeln(sum);
 91     end;
 92     exit(sum);
 93 end;
 94 begin
 95     //assign(input,'1.in');reset(input);
 96     el:=1;
 97     readln(n,m);
 98     for i:=1 to n do read(r[i]);
 99     s:=0; t:=n*n+1;
100     for i:=1 to n do
101     begin
102         if i=1 then add(s,op(i,1),calc(0,r[i]))
103                else add(s,op(i,1),INF);
104         for j:=2 to n do
105             if i<>1 then
106                 add(op(i,j-1),op(i,j),calc(j-1,r[i]))
107             else
108                 add(op(i,j-1),op(i,j),INF);
109         if i=1 then add(op(i,n),t,INF) else add(op(i,n),t,calc(n,r[i]))
110     end;
111  
112     for i:=1 to m do
113     begin
114         readln(x,y);
115         for k:=2 to n do
116         begin
117             add(op(x,k),op(y,k-1),INF);
118             add(op(y,k),op(x,k-1),INF);
119         end;
120     end;
121     n:=n*n+1;
122     writeln(dinic);
123 end.
原文地址:https://www.cnblogs.com/rpSebastian/p/4572236.html