原题

2-SAT+二分答案!

最小的最大值,这肯定是二分答案。而我们要2-SATcheck是否在该情况下有可行解。

对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来实现连边,然后跑2-SAT判断是否有可行解

O(n^2logn)

想起来和听起来都很难写,事实上还好吧…

#include<cstdio>
#include<algorithm>
#include<stack>
#include<cstring>
#define inf 97797977
#define N 510
using namespace std;
int n,m,A,B,lovex[2*N],lovey[2*N],hatex[2*N],hatey[2*N],dis1[N],dis2[N],dis,sx1,sx2,sy1,sy2,x[N],y[N],head[2*N];
int bel[2*N],cnt=1,l,r=inf,dfn[2*N],low[2*N],t,mid,sum;
stack <int> stk;
bool instk[2*N];
struct hhh
{
int to,next;
}edge[10*N*N]; int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
} void add(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
} bool build()
{
for (int i=1;i<=B;i++)
{
add(lovex[i],lovey[i]);
add(lovey[i],lovex[i]);
add(lovex[i]+n,lovey[i]+n);
add(lovey[i]+n,lovex[i]+n);
}
for (int i=1;i<=A;i++)
{
add(hatex[i],hatey[i]+n);
add(hatex[i]+n,hatey[i]);
add(hatey[i]+n,hatex[i]);
add(hatey[i],hatex[i]+n);
}
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
{
int t=0;
if (dis1[i]+dis+dis2[j]>mid)
{
add(i,j);
add(j+n,i+n);
t++;
}
if (dis2[i]+dis+dis1[j]>mid)
{
add(i+n,j+n);
add(j,i);
t++;
}
if (dis1[i]+dis1[j]>mid)
{
add(i,j+n);
add(j,i+n);
t++;
}
if (dis2[i]+dis2[j]>mid)
{
add(i+n,j);
add(j+n,i);
t++;
}
if (t==4) return 0;
}
return 1;
} void Tarjan(int u)
{
dfn[u]=low[u]=++t;
stk.push(u);
instk[u]=1;
for (int i=head[u],v;i;i=edge[i].next)
{
v=edge[i].to;
if (!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (instk[v]) low[u]=min(low[u],dfn[v]);
}
if (low[u]==dfn[u])
{
sum++;
int t;
do
{
t=stk.top();
bel[t]=sum;
stk.pop();
instk[t]=0;
}while(t!=u);
}
} bool check()
{
for (int i=1;i<=n;i++)
if (bel[i]==bel[i+n]) return 0;
return 1;
} int get1(int i)
{
return abs(sx1-x[i])+abs(sy1-y[i]);
} int get2(int i)
{
return abs(sx2-x[i])+abs(sy2-y[i]);
} int main()
{
n=read();
A=read();
B=read();
sx1=read();
sy1=read();
sx2=read();
sy2=read();
dis=abs(sx1-sx2)+abs(sy1-sy2);
for (int i=1;i<=n;i++)
{
x[i]=read();
y[i]=read();
}
for (int i=1;i<=A;i++)
{
hatex[i]=read();
hatey[i]=read();
}
for (int i=1;i<=B;i++)
{
lovex[i]=read();
lovey[i]=read();
}
for (int i=1;i<=n;i++)
{
dis1[i]=get1(i);
dis2[i]=get2(i);
}
while (l<r)
{
mid=(l+r)>>1;
cnt=1;
memset(dfn,0,sizeof(dfn));
memset(bel,0,sizeof(bel));
memset(head,0,sizeof(head));
if (build())
{
t=1;
sum=1;
for (int i=1;i<=2*n;i++)
if (!dfn[i]) Tarjan(i);
if (check()) r=mid;
else l=mid+1;
}
else l=mid+1;
}
printf("%d",l>=inf?-1:l);
return 0;
}

[poj] 2749 building roads的更多相关文章

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

    HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...

  2. poj 2749 Building roads (二分+拆点+2-sat)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6229   Accepted: 2093 De ...

  3. POJ 2749 Building roads 2-sat+二分答案

    把爱恨和最大距离视为限制条件,可以知道,最大距离和限制条件多少具有单调性 所以可以二分最大距离,加边+check #include<cstdio> #include<algorith ...

  4. poj 3625 Building Roads

    题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...

  5. poj 3625 Building Roads(最小生成树,二维坐标,基础)

    题目 //最小生成树,只是变成二维的了 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> ...

  6. poj 2749

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6091   Accepted: 2046 De ...

  7. Building roads

    Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

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

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

  9. poj 1251 Jungle Roads (最小生成树)

    poj   1251  Jungle Roads  (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...

随机推荐

  1. Vue 前端md5加密

    用户注册时将加密后的密码发送给后端存储 当登陆的时候,再将加密后的密码和数据库中加密的密码相匹配. npm: https://www.npmjs.com/package/crypto-browseri ...

  2. scoped,会使设置UI组件库的样式识别不出来

    未设置 scoped 作用域:显示效果 设置作用域的效果:ui组件默认的值(你怎么设置都不管用)

  3. datatable常用设置

    bSort: false, // 是否排序功能 bFilter: false, // 过滤功能 bPaginate: true, // 翻页功能 bInfo: true, // 页脚信息 bProce ...

  4. JDK学习---深入理解java中的LinkedList

    本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn. ...

  5. 一个操作轻松截取长图,Win10上网截长图小技巧!

    截屏的方法有很多,但是有时候我们会遇到比电脑屏幕还大的图,比如网站上的长图.N条引用的评论...你要怎么截取呢?是不是最多只能截全屏?还是要做到第三方的截图软件呢? 下面介绍一种win10电脑自带的滚 ...

  6. Huffman Tree -- Huffman编码

    #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct HuffmanT ...

  7. 13、python中的函数(闭包与装饰器)

    一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...

  8. SVD在推荐系统中的应用详解以及算法推导

    SVD在推荐系统中的应用详解以及算法推导     出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推 ...

  9. 9,K-近邻算法(KNN)

    导引: 如何进行电影分类 众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪 个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问 题 ...

  10. 17,saltstack高效运维

      salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会进行大量的重复性操作,例如安 ...