zoukankan      html  css  js  c++  java
  • 道路修建 (网络流)

      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.
  • 相关阅读:
    111
    RH124-3 目录结构_转
    oracle 查看表空间以及日志文件等系统文件
    bash_profile
    linux 7 关闭防火墙 开启sshd服务
    mount 挂载光盘
    oracle 夸服务器、数据库查询
    Oracle中merge into的使用
    restore和recover的区别
    TCP: time wait bucket table overflow解决方法
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/4572236.html
Copyright © 2011-2022 走看看