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

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

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#define N 5010
#define INF 4000000
using namespace std;
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][],love[N][],indx,inst[N],cnt;
stack <int> st;
int read()
{
int ret=,neg=;
char j=getchar();
for (;j>'' || j<'';j=getchar())
if (j=='-') neg=-;
for (;j>='' && j<='';j=getchar())
ret=ret*+j-'';
return ret*neg;
}
struct edge
{
int nxt,v;
}e[N*N];
int ABS(int x)
{
return x>?x:-x;
}
void add(int u,int v)
{
e[++ecnt].v=v;
e[ecnt].nxt=head[u];
head[u]=ecnt;
}
void init()
{
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
ecnt=;
indx=;
cnt=;
}
void buildG(int lim)
{
for (int i=;i<=a;i++)
{
int u=hate[i][],v=hate[i][];
add(u,v+n),add(v,u+n),add(u+n,v),add(v+n,u);
}
for (int i=;i<=b;i++)
{
int u=love[i][],v=love[i][];
add(u,v),add(v+n,u+n),add(u+n,v+n),add(v,u);
}
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
{
if (dis1[i]+dis2[j]+tmp>lim)
add(i,j),add(j+n,i+n);
if (dis2[i]+dis1[j]+tmp>lim)
add(i+n,j+n),add(j,i);
if (dis1[i]+dis1[j]>lim)
add(i,j+n),add(j,i+n);
if (dis2[i]+dis2[j]>lim)
add(i+n,j),add(j+n,i);
}
}
void tar(int u)
{
dfn[u]=low[u]=++indx;
inst[u]=;
st.push(u);
for (int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if (!dfn[v])
{
tar(v);
low[u]=min(low[v],low[u]);
}
else if (inst[v])
low[u]=min(dfn[v],low[u]);
}
if (low[u]==dfn[u])
{
int t;
++cnt;
while ()
{
t=st.top();
inst[t]=;
st.pop();
belong[t]=cnt;
if (t==u) break;
}
}
}
int check(int lim)
{
init();
buildG(lim);
for (int i=;i<=*n;i++)
if (!dfn[i]) tar(i);
for (int i=;i<=n;i++)
if (belong[i]==belong[i+n]) return ;
return ;
}
int main()
{
n=read(),a=read(),b=read();
sx1=read(),sy1=read(),sx2=read(),sy2=read();
tmp=ABS(sx1-sx2)+ABS(sy1-sy2);
for (int i=;i<=n;i++)
{
x[i]=read(),y[i]=read();
dis1[i]=ABS(x[i]-sx1)+ABS(y[i]-sy1);
dis2[i]=ABS(x[i]-sx2)+ABS(y[i]-sy2);
}
for (int i=;i<=a;i++)
hate[i][]=read(),hate[i][]=read();
for (int i=;i<=b;i++)
love[i][]=read(),love[i][]=read();
int l=,r=INF,mid;
while (l<r)
{
mid=(l+r)>>;
if (check(mid)==) r=mid;
else l=mid+;
}
printf("%d\n",l==INF?-:l);
return ;
}

POJ 2749 Building roads 2-sat+二分答案的更多相关文章

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

  4. poj 3625 Building Roads

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

  5. POJ 1226 Substrings(后缀数组+二分答案)

    [题目链接] http://poj.org/problem?id=1226 [题目大意] 求在每个给出字符串中出现的最长子串的长度,字符串在出现的时候可以是倒置的. [题解] 我们将每个字符串倒置,用 ...

  6. poj 3294 Life Forms - 后缀数组 - 二分答案

    题目传送门 传送门I 传送门II 题目大意 给定$n$个串,询问所有出现在严格大于$\frac{n}{2}$个串的最长串.不存在输出'?' 用奇怪的字符把它们连接起来.然后求sa,hei,二分答案,按 ...

  7. poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...

  8. Poj 1743 Musical Theme(后缀数组+二分答案)

    Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...

  9. Poj 3261 Milk Patterns(后缀数组+二分答案)

    Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...

随机推荐

  1. JavaScript中并非一切皆对象

    对象是js中的基础以及核心,在js中有六种主要类型:string  number  boolean null undefined object 除了oject类型以为其他五种本身并非对象,null本身 ...

  2. C++二维数组动态申请内存

    好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到 ...

  3. 使用泛型实现对int数组或者String数组进行排序

    因为是使用的泛型,我们并不确定数据类型, 对于数据的比较就不能用平时的大于或者小于. 我们需要比较对象实现Comparable接口,该接口下的compareTo()方法可以用来比大小 定义Sort类: ...

  4. Mybatis与Hibernate区别

    Mybatis与Hibernate区别 mybatis: 1. 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美 ...

  5. MyEclipse的快捷键大全(超级实用,方便)

    常用快捷键 1. [ALT+/] 能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ALT+/]快捷键带来的好处吧. 2. [Ctrl+O]  显示类 ...

  6. 【Mysql】给mysql配置远程登录

    grant all privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option; flush privileges ...

  7. tcl之正则表达式

  8. 使用union all 命令之后如何对hive表格进行去重

    业务场景大概是这样的,这里由两个hive表格,tableA 和 tableB, 格式内容都是这样的: uid cate1 cate2 在hive QL中,我们知道union有着自动去重的功能,但是那是 ...

  9. easypoi 一行代码搞定excel导入导出

    开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子[easypoi],下面介绍下“轮子”的使用. pom ...

  10. python 函数function

    函数 当代码出现有规律的重复的时候,只写一次函数实现多次使用(调用) 可使用的函数: 自定义函数 内置函数:文档  https://docs.python.org/3/library/function ...