练了这么久,应该就成了裸的最大流了吧

不1Y对不起自己

  1 const inf=1000007;
  2 type node=record
  3        next,point,flow:longint;
  4      end;
  5 
  6 var edge:array[0..200010] of node;
  7     a:array[0..30,0..30] of longint;
  8     p,x,y,numh,h,cur,pre,f:array[0..1010] of longint;
  9     len,ans,sum,t,tot,i,j,n,m,d:longint;
 10     c:char;
 11 
 12 function min(a,b:longint):longint;
 13   begin
 14     if a>b then exit(b) else exit(a);
 15   end;
 16 
 17 procedure add(x,y,f:longint);
 18   begin
 19     inc(len);
 20     edge[len].point:=y;
 21     edge[len].flow:=f;
 22     edge[len].next:=p[x];
 23     p[x]:=len;
 24   end;
 25 
 26 procedure sap;
 27   var u,q,i,j,tmp,neck:longint;
 28   begin
 29     u:=0;
 30     numh[0]:=tot+1;
 31     while h[0]<tot+1 do
 32     begin
 33       if u=tot then
 34       begin
 35         i:=0;
 36         while i<>tot do
 37         begin
 38           j:=cur[i];
 39           dec(edge[j].flow);
 40           inc(edge[j xor 1].flow);
 41           i:=edge[j].point;
 42         end;
 43         u:=0;
 44         inc(ans);
 45       end;
 46       q:=-1;
 47       i:=p[u];
 48       while i<>-1 do
 49       begin
 50         j:=edge[i].point;
 51         if (edge[i].flow>0) and (h[u]=h[j]+1) then
 52         begin
 53           q:=i;
 54           break;
 55         end;
 56         i:=edge[i].next;
 57       end;
 58       if q<>-1 then
 59       begin
 60         cur[u]:=q;
 61         pre[j]:=u;
 62         u:=j;
 63       end
 64       else begin
 65         dec(numh[h[u]]);
 66         if numh[h[u]]=0 then exit;
 67         tmp:=tot+1;
 68         i:=p[u];
 69         while i<>-1 do
 70         begin
 71           j:=edge[i].point;
 72           if edge[i].flow>0 then tmp:=min(tmp,h[j]);
 73           i:=edge[i].next;
 74         end;
 75         h[u]:=tmp+1;
 76         inc(numh[h[u]]);
 77         if u<>0 then u:=pre[u];
 78       end;
 79     end;
 80   end;
 81 
 82 begin
 83   readln(n,m,d);
 84   len:=-1;
 85   fillchar(p,sizeof(p),255);
 86   for i:=1 to n do
 87   begin
 88     for j:=1 to m do
 89     begin
 90       read(c);
 91       if c<>'0' then
 92       begin
 93         inc(t);
 94         f[t]:=ord(c)-48;
 95         x[t]:=i;
 96         y[t]:=j;
 97         a[i,j]:=t;
 98       end;
 99     end;
100     readln;
101   end;
102   for i:=1 to n do
103   begin
104     for j:=1 to m do
105     begin
106       read(c);
107       if c='L' then
108       begin
109         inc(sum);
110         add(0,a[i,j],1);
111         add(a[i,j],0,0);
112       end;
113     end;
114     readln;
115   end;
116   tot:=t shl 1+1;
117   for i:=1 to t do
118   begin
119     for j:=i+1 to t do
120       if d*d>=sqr(x[i]-x[j])+sqr(y[i]-y[j]) then
121       begin
122         add(i+t,j,inf);
123         add(j,i+t,0);
124         add(j+t,i,inf);
125         add(i,j+t,0);
126       end;
127     if (x[i]+d>n) or (x[i]-d<=0) or (y[i]+d>m) or (y[i]-d<=0) then
128     begin
129       add(i+t,tot,inf);
130       add(tot,i+t,0);
131     end;
132     add(i,i+t,f[i]);
133     add(i+t,i,0);
134   end;
135   sap;
136   writeln(sum-ans);
137 end.
View Code

 

posted on 2014-05-02 20:30  acphile  阅读(112)  评论(0编辑  收藏