poj2749

万变不离其宗

只要搞清楚题目的基本模型

搞清楚边是一种推导出的关系

搞清楚里面的逻辑关系

那就没什么难的了……

二分+sat,没什么好说的

  1 const inf=100000007;
  2 
  3 type node=record
  4 
  5        point,next:longint;
  6 
  7      end;
  8 
  9 var edge:array[0..4000010] of node;
 10 
 11     v,f:array[0..1010] of boolean;
 12 
 13     x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[0..1010] of longint;
 14 
 15     sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint;
 16 
 17 
 18 
 19 function min(a,b:longint):longint;
 20 
 21   begin
 22 
 23     if a>b then exit(b) else exit(a);
 24 
 25   end;
 26 
 27 
 28 
 29 function max(a,b:longint):longint;
 30 
 31   begin
 32 
 33     if a>b then exit(a) else exit(b);
 34 
 35   end;
 36 
 37 
 38 
 39 function dis(i,j:longint):longint;
 40 
 41   begin
 42 
 43     exit(abs(x[i]-x[j])+abs(y[i]-y[j]));
 44 
 45   end;
 46 
 47 
 48 
 49 procedure add(x,y:longint);
 50 
 51   begin
 52 
 53     inc(len);
 54 
 55     edge[len].point:=y;
 56 
 57     edge[len].next:=p[x];
 58 
 59     p[x]:=len;
 60 
 61   end;
 62 
 63 
 64 
 65 procedure tarjan(x:longint);
 66 
 67   var i,y:longint;
 68 
 69   begin
 70 
 71     inc(h);
 72 
 73     inc(t);
 74 
 75     dfn[x]:=h;
 76 
 77     low[x]:=h;
 78 
 79     f[x]:=true;
 80 
 81     v[x]:=true;
 82 
 83     st[t]:=x;
 84 
 85     i:=p[x];
 86 
 87     while i<>-1 do
 88 
 89     begin
 90 
 91       y:=edge[i].point;
 92 
 93       if not v[y] then
 94 
 95       begin
 96 
 97         tarjan(y);
 98 
 99         low[x]:=min(low[x],low[y]);
100 
101       end
102 
103       else if f[y] then low[x]:=min(low[x],low[y]);
104 
105       i:=edge[i].next;
106 
107     end;
108 
109     if dfn[x]=low[x] then
110 
111     begin
112 
113       inc(sum);
114 
115       while st[t+1]<>x do
116 
117       begin
118 
119         y:=st[t];
120 
121         f[y]:=false;
122 
123         be[y]:=sum;
124 
125         dec(t);
126 
127       end;
128 
129     end;
130 
131   end;
132 
133 
134 
135 function check(k:longint):boolean;
136 
137   var i,x,y,j:longint;
138 
139   begin
140 
141     len:=0;
142 
143     fillchar(p,sizeof(p),255);
144 
145     fillchar(v,sizeof(v),false);
146 
147     fillchar(st,sizeof(st),0);
148 
149     fillchar(be,sizeof(be),0);
150 
151     for i:=1 to a do
152 
153     begin
154 
155       x:=hx[i];
156 
157       y:=hy[i];
158 
159       add(x,y+n);
160 
161       add(x+n,y);
162 
163       add(y+n,x);
164 
165       add(y,x+n);
166 
167     end;
168 
169     for i:=1 to b do
170 
171     begin
172 
173       x:=fx[i];
174 
175       y:=fy[i];
176 
177       add(x,y);
178 
179       add(y,x);
180 
181       add(x+n,y+n);
182 
183       add(y+n,x+n);
184 
185     end;
186 
187     for i:=1 to n-1 do
188 
189       for j:=i+1 to n do
190 
191       begin
192 
193         if w1[i]+w1[j]>k then
194 
195         begin
196 
197           add(j,i+n);
198 
199           add(i,j+n);
200 
201         end;
202 
203         if w2[i]+w2[j]>k then
204 
205         begin
206 
207           add(i+n,j);
208 
209           add(j+n,i);
210 
211         end;
212 
213         if w1[i]+w+w2[j]>k then
214 
215         begin
216 
217           add(i,j);
218 
219           add(j+n,i+n);
220 
221         end;
222 
223         if w2[i]+w+w1[j]>k then
224 
225         begin
226 
227           add(i+n,j+n);
228 
229           add(j,i);
230 
231         end;
232 
233       end;
234 
235     sum:=0;
236 
237     for i:=1 to 2*n do
238 
239       if not v[i] then
240 
241       begin
242 
243         h:=0;
244 
245         t:=0;
246 
247         tarjan(i);
248 
249       end;
250 
251 
252 
253     for i:=1 to n do
254 
255       if be[i]=be[i+n] then exit(false);
256 
257     exit(true);
258 
259   end;
260 
261 
262 
263 begin
264 
265   readln(n,a,b);
266 
267   l:=inf;
268 
269   r:=0;
270 
271   readln(x[n+1],y[n+1],x[n+2],y[n+2]);
272 
273   w:=dis(n+1,n+2);
274 
275   for i:=1 to n do
276 
277   begin
278 
279     readln(x[i],y[i]);
280 
281     w1[i]:=dis(i,n+1);
282 
283     w2[i]:=dis(i,n+2);
284 
285     l:=min(l,min(w1[i],w2[i]));
286 
287     r:=max(r,max(w1[i],w2[i]));
288 
289   end;
290 
291   r:=r shl 1+w;
292 
293   for i:=1 to a do
294 
295     readln(hx[i],hy[i]);
296 
297   for i:=1 to b do
298 
299     readln(fx[i],fy[i]);
300 
301   ans:=inf;
302 
303   while l<=r do
304 
305   begin
306 
307     m:=(l+r) shr 1;
308 
309     if check(m) then
310 
311     begin
312 
313       ans:=m;
314 
315       r:=m-1;
316 
317     end
318 
319     else l:=m+1;
320 
321   end;
322 
323   if ans=inf then writeln(-1) else writeln(ans);
324 
325 end.
326 
327 
328 
329 
330 const inf=100000007;
331 type node=record
332        point,next:longint;
333      end;
334 var edge:array[0..4000010] of node;
335     v,f:array[0..1010] of boolean;
336     x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[0..1010] of longint;
337     sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint;
338 
339 function min(a,b:longint):longint;
340   begin
341     if a>b then exit(b) else exit(a);
342   end;
343 
344 function max(a,b:longint):longint;
345   begin
346     if a>b then exit(a) else exit(b);
347   end;
348 
349 function dis(i,j:longint):longint;
350   begin
351     exit(abs(x[i]-x[j])+abs(y[i]-y[j]));
352   end;
353 
354 procedure add(x,y:longint);
355   begin
356     inc(len);
357     edge[len].point:=y;
358     edge[len].next:=p[x];
359     p[x]:=len;
360   end;
361 
362 procedure tarjan(x:longint);
363   var i,y:longint;
364   begin
365     inc(h);
366     inc(t);
367     dfn[x]:=h;
368     low[x]:=h;
369     f[x]:=true;
370     v[x]:=true;
371     st[t]:=x;
372     i:=p[x];
373     while i<>-1 do
374     begin
375       y:=edge[i].point;
376       if not v[y] then
377       begin
378         tarjan(y);
379         low[x]:=min(low[x],low[y]);
380       end
381       else if f[y] then low[x]:=min(low[x],low[y]);
382       i:=edge[i].next;
383     end;
384     if dfn[x]=low[x] then
385     begin
386       inc(sum);
387       while st[t+1]<>x do
388       begin
389         y:=st[t];
390         f[y]:=false;
391         be[y]:=sum;
392         dec(t);
393       end;
394     end;
395   end;
396 
397 function check(k:longint):boolean;
398   var i,x,y,j:longint;
399   begin
400     len:=0;
401     fillchar(p,sizeof(p),255);
402     fillchar(v,sizeof(v),false);
403     fillchar(st,sizeof(st),0);
404     fillchar(be,sizeof(be),0);
405     for i:=1 to a do
406     begin
407       x:=hx[i];
408       y:=hy[i];
409       add(x,y+n);
410       add(x+n,y);
411       add(y+n,x);
412       add(y,x+n);
413     end;
414     for i:=1 to b do
415     begin
416       x:=fx[i];
417       y:=fy[i];
418       add(x,y);
419       add(y,x);
420       add(x+n,y+n);
421       add(y+n,x+n);
422     end;
423     for i:=1 to n-1 do
424       for j:=i+1 to n do
425       begin
426         if w1[i]+w1[j]>k then
427         begin
428           add(j,i+n);
429           add(i,j+n);
430         end;
431         if w2[i]+w2[j]>k then
432         begin
433           add(i+n,j);
434           add(j+n,i);
435         end;
436         if w1[i]+w+w2[j]>k then
437         begin
438           add(i,j);
439           add(j+n,i+n);
440         end;
441         if w2[i]+w+w1[j]>k then
442         begin
443           add(i+n,j+n);
444           add(j,i);
445         end;
446       end;
447     sum:=0;
448     for i:=1 to 2*n do
449       if not v[i] then
450       begin
451         h:=0;
452         t:=0;
453         tarjan(i);
454       end;
455 
456     for i:=1 to n do
457       if be[i]=be[i+n] then exit(false);
458     exit(true);
459   end;
460 
461 begin
462   readln(n,a,b);
463   l:=inf;
464   r:=0;
465   readln(x[n+1],y[n+1],x[n+2],y[n+2]);
466   w:=dis(n+1,n+2);
467   for i:=1 to n do
468   begin
469     readln(x[i],y[i]);
470     w1[i]:=dis(i,n+1);
471     w2[i]:=dis(i,n+2);
472     l:=min(l,min(w1[i],w2[i]));
473     r:=max(r,max(w1[i],w2[i]));
474   end;
475   r:=r shl 1+w;
476   for i:=1 to a do
477     readln(hx[i],hy[i]);
478   for i:=1 to b do
479     readln(fx[i],fy[i]);
480   ans:=inf;
481   while l<=r do
482   begin
483     m:=(l+r) shr 1;
484     if check(m) then
485     begin
486       ans:=m;
487       r:=m-1;
488     end
489     else l:=m+1;
490   end;
491   if ans=inf then writeln(-1) else writeln(ans);
492 end.
View Code
原文地址:https://www.cnblogs.com/phile/p/4473210.html