万变不离其宗

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

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

搞清楚里面的逻辑关系

那就没什么难的了……

二分+sat,没什么好说的

 const inf=;

 type node=record

        point,next:longint;

      end;

 var edge:array[..] of node;

     v,f:array[..] of boolean;

     x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[..] of longint;

     sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint;

 function min(a,b:longint):longint;

   begin

     if a>b then exit(b) else exit(a);

   end;

 function max(a,b:longint):longint;

   begin

     if a>b then exit(a) else exit(b);

   end;

 function dis(i,j:longint):longint;

   begin

     exit(abs(x[i]-x[j])+abs(y[i]-y[j]));

   end;

 procedure add(x,y:longint);

   begin

     inc(len);

     edge[len].point:=y;

     edge[len].next:=p[x];

     p[x]:=len;

   end;

 procedure tarjan(x:longint);

   var i,y:longint;

   begin

     inc(h);

     inc(t);

     dfn[x]:=h;

     low[x]:=h;

     f[x]:=true;

     v[x]:=true;

     st[t]:=x;

     i:=p[x];

     while i<>- do

     begin

       y:=edge[i].point;

       if not v[y] then

       begin

         tarjan(y);

         low[x]:=min(low[x],low[y]);

       end

       else if f[y] then low[x]:=min(low[x],low[y]);

       i:=edge[i].next;

     end;

     if dfn[x]=low[x] then

     begin

       inc(sum);

       while st[t+]<>x do

       begin

         y:=st[t];

         f[y]:=false;

         be[y]:=sum;

         dec(t);

       end;

     end;

   end;

 function check(k:longint):boolean;

   var i,x,y,j:longint;

   begin

     len:=;

     fillchar(p,sizeof(p),);

     fillchar(v,sizeof(v),false);

     fillchar(st,sizeof(st),);

     fillchar(be,sizeof(be),);

     for i:= to a do

     begin

       x:=hx[i];

       y:=hy[i];

       add(x,y+n);

       add(x+n,y);

       add(y+n,x);

       add(y,x+n);

     end;

     for i:= to b do

     begin

       x:=fx[i];

       y:=fy[i];

       add(x,y);

       add(y,x);

       add(x+n,y+n);

       add(y+n,x+n);

     end;

     for i:= to n- do

       for j:=i+ to n do

       begin

         if w1[i]+w1[j]>k then

         begin

           add(j,i+n);

           add(i,j+n);

         end;

         if w2[i]+w2[j]>k then

         begin

           add(i+n,j);

           add(j+n,i);

         end;

         if w1[i]+w+w2[j]>k then

         begin

           add(i,j);

           add(j+n,i+n);

         end;

         if w2[i]+w+w1[j]>k then

         begin

           add(i+n,j+n);

           add(j,i);

         end;

       end;

     sum:=;

     for i:= to *n do

       if not v[i] then

       begin

         h:=;

         t:=;

         tarjan(i);

       end;

     for i:= to n do

       if be[i]=be[i+n] then exit(false);

     exit(true);

   end;

 begin

   readln(n,a,b);

   l:=inf;

   r:=;

   readln(x[n+],y[n+],x[n+],y[n+]);

   w:=dis(n+,n+);

   for i:= to n do

   begin

     readln(x[i],y[i]);

     w1[i]:=dis(i,n+);

     w2[i]:=dis(i,n+);

     l:=min(l,min(w1[i],w2[i]));

     r:=max(r,max(w1[i],w2[i]));

   end;

   r:=r shl +w;

   for i:= to a do

     readln(hx[i],hy[i]);

   for i:= to b do

     readln(fx[i],fy[i]);

   ans:=inf;

   while l<=r do

   begin

     m:=(l+r) shr ;

     if check(m) then

     begin

       ans:=m;

       r:=m-;

     end

     else l:=m+;

   end;

   if ans=inf then writeln(-) else writeln(ans);

 end.

 const inf=;
type node=record
       point,next:longint;
     end;
var edge:array[..] of node;
    v,f:array[..] of boolean;
    x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[..] of longint;
    sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint; function min(a,b:longint):longint;
  begin
    if a>b then exit(b) else exit(a);
  end; function max(a,b:longint):longint;
  begin
    if a>b then exit(a) else exit(b);
  end; function dis(i,j:longint):longint;
  begin
    exit(abs(x[i]-x[j])+abs(y[i]-y[j]));
  end; procedure add(x,y:longint);
  begin
    inc(len);
    edge[len].point:=y;
    edge[len].next:=p[x];
    p[x]:=len;
  end; procedure tarjan(x:longint);
  var i,y:longint;
  begin
    inc(h);
    inc(t);
    dfn[x]:=h;
    low[x]:=h;
    f[x]:=true;
    v[x]:=true;
    st[t]:=x;
    i:=p[x];
    while i<>- do
    begin
      y:=edge[i].point;
      if not v[y] then
      begin
        tarjan(y);
        low[x]:=min(low[x],low[y]);
      end
      else if f[y] then low[x]:=min(low[x],low[y]);
      i:=edge[i].next;
    end;
    if dfn[x]=low[x] then
    begin
      inc(sum);
      while st[t+]<>x do
      begin
        y:=st[t];
        f[y]:=false;
        be[y]:=sum;
        dec(t);
      end;
    end;
  end; function check(k:longint):boolean;
  var i,x,y,j:longint;
  begin
    len:=;
    fillchar(p,sizeof(p),);
    fillchar(v,sizeof(v),false);
    fillchar(st,sizeof(st),);
    fillchar(be,sizeof(be),);
    for i:= to a do
    begin
      x:=hx[i];
      y:=hy[i];
      add(x,y+n);
      add(x+n,y);
      add(y+n,x);
      add(y,x+n);
    end;
    for i:= to b do
    begin
      x:=fx[i];
      y:=fy[i];
      add(x,y);
      add(y,x);
      add(x+n,y+n);
      add(y+n,x+n);
    end;
    for i:= to n- do
      for j:=i+ to n do
      begin
        if w1[i]+w1[j]>k then
        begin
          add(j,i+n);
          add(i,j+n);
        end;
        if w2[i]+w2[j]>k then
        begin
          add(i+n,j);
          add(j+n,i);
        end;
        if w1[i]+w+w2[j]>k then
        begin
          add(i,j);
          add(j+n,i+n);
        end;
        if w2[i]+w+w1[j]>k then
        begin
          add(i+n,j+n);
          add(j,i);
        end;
      end;
    sum:=;
    for i:= to *n do
      if not v[i] then
      begin
        h:=;
        t:=;
        tarjan(i);
      end;     for i:= to n do
      if be[i]=be[i+n] then exit(false);
    exit(true);
  end; begin
  readln(n,a,b);
  l:=inf;
  r:=;
  readln(x[n+],y[n+],x[n+],y[n+]);
  w:=dis(n+,n+);
  for i:= to n do
  begin
    readln(x[i],y[i]);
    w1[i]:=dis(i,n+);
    w2[i]:=dis(i,n+);
    l:=min(l,min(w1[i],w2[i]));
    r:=max(r,max(w1[i],w2[i]));
  end;
  r:=r shl +w;
  for i:= to a do
    readln(hx[i],hy[i]);
  for i:= to b do
    readln(fx[i],fy[i]);
  ans:=inf;
  while l<=r do
  begin
    m:=(l+r) shr ;
    if check(m) then
    begin
      ans:=m;
      r:=m-;
    end
    else l:=m+;
  end;
  if ans=inf then writeln(-) else writeln(ans);
end.

poj2749的更多相关文章

  1. [POJ2749]Building roads(2-SAT)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8153   Accepted: 2772 De ...

  2. Poj2749:Building roads

    题意 有 N 个牛栏,现在通过一条通道(s1,s2)要么连到s1,要么连到s2,把他们连起来,他们之间有一些约束关系,一些牛栏不能连在同一个点,一些牛栏必须连在同一个点,现在问有没有可能把他们都连好, ...

  3. POJ2749 Building roads

    嘟嘟嘟 最近把21天漏的给不上. 今天重温了一下2-SAT,感觉很简单.就是把所有条件都转化成如果--必然能导出--.然后就这样连边建图,这样一个强连通分量中的所有点必然都是真或者假.从而根据这个点拆 ...

  4. POJ2749:Building roads——题解

    http://poj.org/problem?id=2749 (这个约翰的奶牛真多事…………………………) i表示u与s1连,i+n表示u与s2连. 老规矩,u到v表示取u必须取v. 那么对于互相打架 ...

  5. POJ2749 Building roads 【2-sat】

    题目 Farmer John's farm has N barns, and there are some cows that live in each barn. The cows like to ...

  6. POJ2749 Building road

    传送门 这道题真是2-SAT好题啊!!卡了我两个点才做完……垃圾POJ还不告诉我哪错了…… 首先我们先花一段时间把题看懂……(其实是翻译一下),之后我们发现因为每个谷仓只能向一个中转点连边,所以他就是 ...

  7. POJ2749 题解

    题目大意:有若干牛圈和两个连接起来的的中转点S1,S2.每个牛圈需要选择其中一个中转点与之连接,从而使任意两个牛圈能够连通.有若干对牛圈里的牛互相hate或是互相like.若两个牛圈里的牛互相hate ...

  8. 2-SAT 问题

    2-SAT 问题是k-SAT问题在k==2时的特殊情况,因为已经证明k>=3时的k-sat问题属于npc问题.所以在这里仅研究2-SAT的特殊情况.   何为2-sat问题? 简单地说就是有N个 ...

  9. ACM训练计划step 2 [非原创]

    (Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...

随机推荐

  1. hibernate初探

    1.在MyEclipse Datebase Explorer 页面中新创建一个连接数据库“DB Browser”的XX,如起名“register”2.新建项目->右键Properties-> ...

  2. .NET小项目之MyKtv(歌曲播放功能实现)

    在KTV点歌系统中我们根据需求获取到歌手的歌曲信息,点击歌手的歌曲将其添加到一点歌曲列表中看似简单的一个操作其实涉及很多内容,这也是写这篇Blog的目的—分析歌曲播放的原理. 原理分析 我们应该清楚, ...

  3. 网址、URL

    手册网:http://www.shouce.ren/ in_array().array_search().array_key_exists() http://www.shangxueba.com/ji ...

  4. MySql启动提示:The server quit without updating PID file(…)失败

    在网上找了很多 1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限解决方法 :给予权限,执行 “chown -R mysql:mysql /var/data”  ...

  5. java basic

    //java 声明常量 //final 数据类型 常量名=值; //as: final float PI=3.14f;/ PI=3.14002F //默认浮点为 double //break:跳出多重 ...

  6. [DevExpress]SplitContainerControl使用小计

    1.修改成纵向分割 Horizontal = false; 2.设置伸缩箭头 3.固定某个PANEL大小 最大化后依然保持着比例 4.隐藏某个PANEL splitContainerControl1. ...

  7. HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

    看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难 ...

  8. 【Git 】$ ./gradlew idea 构建一个idea的项目

    Welcome to Git (version 1.9.5-preview20150319) Run 'git help git' to display the help index.Run 'git ...

  9. 一步步学习ASP.NET MVC3 (5)——View从Action中获得数据

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们把Razor的模板技术给大家介绍了一下,当然模板中还有其他的知识点,这个以后我们还会继续讲解.本章我们主要讨论 ...

  10. componentsJoinedByString 和 componentsSeparatedByString 的方法的区别

    将string字符串转换为array数组 NSArray  *array = [Str componentsSeparatedByString:@","]; 将array数组转换为 ...