把爱恨和最大距离视为限制条件,可以知道,最大距离和限制条件多少具有单调性

所以可以二分最大距离,加边+check

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<vector>
  5 #include<stack>
  6 #define N 5010
  7 #define INF 4000000
  8 using namespace std;
  9 int dis1[N],a,b,n,dis2[N],sx1,sy1,sx2,sy2,head[N],dfn[N],low[N],ecnt,x[N],y[N],tmp,ok,belong[N],hate[N][3],love[N][3],indx,inst[N],cnt;
 10 stack <int> st;
 11 int read()
 12 {
 13     int ret=0,neg=1;
 14     char j=getchar();
 15     for (;j>'9' || j<'0';j=getchar())
 16     if (j=='-') neg=-1;
 17     for (;j>='0' && j<='9';j=getchar())
 18     ret=ret*10+j-'0';
 19     return ret*neg;
 20 }
 21 struct edge
 22 {
 23     int nxt,v;
 24 }e[N*N];
 25 int ABS(int x)
 26 {
 27     return x>0?x:-x;
 28 }
 29 void add(int u,int v)
 30 {
 31     e[++ecnt].v=v;
 32     e[ecnt].nxt=head[u];
 33     head[u]=ecnt;
 34 }
 35 void init()
 36 {
 37     memset(head,0,sizeof(head));
 38     memset(dfn,0,sizeof(dfn));
 39     ecnt=0;
 40     indx=0;
 41     cnt=0;
 42 }
 43 void buildG(int lim)
 44 {
 45     for (int i=1;i<=a;i++)
 46     {
 47     int u=hate[i][0],v=hate[i][1];
 48     add(u,v+n),add(v,u+n),add(u+n,v),add(v+n,u);
 49     }
 50     for (int i=1;i<=b;i++)
 51     {
 52     int u=love[i][0],v=love[i][1];
 53     add(u,v),add(v+n,u+n),add(u+n,v+n),add(v,u);
 54     }
 55     for (int i=1;i<=n;i++)
 56     for (int j=i+1;j<=n;j++)
 57     {
 58         if (dis1[i]+dis2[j]+tmp>lim)
 59         add(i,j),add(j+n,i+n);
 60         if (dis2[i]+dis1[j]+tmp>lim)
 61         add(i+n,j+n),add(j,i);
 62         if (dis1[i]+dis1[j]>lim)
 63         add(i,j+n),add(j,i+n);
 64         if (dis2[i]+dis2[j]>lim)
 65         add(i+n,j),add(j+n,i);
 66     }
 67 }
 68 void tar(int u)
 69 {
 70     dfn[u]=low[u]=++indx;
 71     inst[u]=1;
 72     st.push(u);
 73     for (int i=head[u];i;i=e[i].nxt)
 74     {
 75     int v=e[i].v;
 76     if (!dfn[v])
 77     {
 78         tar(v);
 79         low[u]=min(low[v],low[u]);
 80     }
 81     else if (inst[v])
 82         low[u]=min(dfn[v],low[u]);
 83     }
 84     if (low[u]==dfn[u])
 85     {
 86     int t;
 87     ++cnt;
 88     while (1)
 89     {
 90         t=st.top();
 91         inst[t]=0;
 92         st.pop();
 93         belong[t]=cnt;
 94         if (t==u) break;
 95     }
 96     }
 97 }
 98 int check(int lim)
 99 {
100     init();
101     buildG(lim);
102     for (int i=1;i<=2*n;i++)
103     if (!dfn[i]) tar(i);
104     for (int i=1;i<=n;i++)
105     if (belong[i]==belong[i+n]) return 0;
106     return 1;
107 }
108 int main()
109 {
110     n=read(),a=read(),b=read();
111     sx1=read(),sy1=read(),sx2=read(),sy2=read();
112     tmp=ABS(sx1-sx2)+ABS(sy1-sy2);
113     for (int i=1;i<=n;i++)
114     {
115     x[i]=read(),y[i]=read();
116     dis1[i]=ABS(x[i]-sx1)+ABS(y[i]-sy1);
117     dis2[i]=ABS(x[i]-sx2)+ABS(y[i]-sy2);
118     }
119     for (int i=1;i<=a;i++)
120     hate[i][0]=read(),hate[i][1]=read();
121     for (int i=1;i<=b;i++)
122     love[i][0]=read(),love[i][1]=read();
123     int l=0,r=INF,mid;
124     while (l<r)
125     {
126     mid=(l+r)>>1;
127     if (check(mid)==1) r=mid;
128     else l=mid+1;
129     }
130     printf("%d\n",l==INF?-1:l);
131     return 0;
132 }

转载于:https://www.cnblogs.com/mrsheep/p/7855949.html

POJ 2749 Building roads 2-sat+二分答案相关推荐

  1. HDU 1815, POJ 2749 Building roads(2-sat)

    HDU 1815, POJ 2749 Building roads 题目链接HDU 题目链接POJ 题意: 有n个牛棚, 还有两个中转站S1和S2, S1和S2用一条路连接起来. 为了使得随意牛棚两个 ...

  2. [poj] 2749 building roads

    原题 2-SAT+二分答案! 最小的最大值,这肯定是二分答案.而我们要2-SATcheck是否在该情况下有可行解. 对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来 ...

  3. POJ 2749 Building roads

    POJ_2749 一开始没有想到去二分距离,看了别人的报告之后恍然大悟. 这是一个2-SAT的问题,首先我们要去找到核心变量,可以看出每个牛的有着要么和S1相连,要么和S2相连的逻辑关系,因此可以把奶 ...

  4. POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)

    $ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...

  5. poj 3208 Apocalypse Someday 数位dp+二分答案

    Apocalypse Someday Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 2203   Accepted: 11 ...

  6. poj 1064 java_poj 1064(二分答案)

    题意: 有N条绳子,长度分别为 length[1,2,3,........,N]. 如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长有多长? 结果保留两位小数. 题解: 二分可能的长度. AC ...

  7. poj 3258 River Hopscotch 二分答案

    题目地址: http://poj.org/problem?id=3258 题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况) ...

  8. POJ 1064 Cable master (二分答案)

    题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...

  9. POJ 3579 二分答案

    POJ 3579 二分答案 文章目录 POJ 3579 二分答案 题目 思路 代码 题目 思路 排序,二分一下答案,然后对于每一个元素看一看加上这个答案tmp之后,在数列里面排在哪里,比a[i]+tm ...

最新文章

  1. 18个让程序员流泪的瞬间,已笑喷,哈哈哈哈哈哈!
  2. 微软Excel竟能实现CV算法:亚马逊工程师妙用,人脸检测、字符识别都不在话下...
  3. 3D Vision公开课 | 移动机器人视觉三维感知的现在与将来
  4. Linux下的进程池(1)
  5. CSU 1115: 最短的名字(字典树)
  6. unity 凸包算法
  7. 【深度学习案例】手写数字项目实现-3. Matlab深度学习模型训练
  8. cad2019菜单栏怎么调出来_cad怎样调出菜单栏(cad2016工具栏怎么调出来)
  9. hdu2122 poj2485 最小生成树
  10. 数据分析,机器学习学习用数据集[1]-搜狗新闻行业分类数据集(已分好训练测试和验证集)
  11. Aspose.word Java实现html转word,word转html
  12. Python操作MyS QL
  13. 软件测试周刊(第08期):大过节的
  14. java facet 是什么_eclipse中project facet问题
  15. SQL 的一点简单的面试题求助
  16. 2021年煤气考试题库及煤气免费试题
  17. 控制科学与工程(自动化)保研经验【2】——南开、同济篇
  18. Windows驱动开发WDM (1) - 基本结构
  19. web server+app server
  20. cn.sample.mnn.detect A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid

热门文章

  1. Mapped Statements collection does not contain value for TaskMapper.selectByPrimaryKey
  2. 分类算法之贝叶斯网络(Bayesian networks)
  3. ACM网络赛金华赛区的一道关于树的题:Family Name List
  4. 艾伟_转载:把事件当作对象进行传递
  5. 让Sandcastle为你的类库生成类似于MSDN的帮助文档
  6. ubuntu16.04 安装CAJViewer 以及 安装wine /deepin-wine 图标异常的解决
  7. Verilog中testbench的设计,文件读取和写入操作
  8. html底部沉底显示,Footer部分永远沉底。
  9. XP新建管理员账户后administrator消失或者不能登录的解决方法!
  10. java --String类解决面试问题