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

所以可以二分最大距离,加边+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. MySQL中事物的详解

    1. 事物的定义及特性 事务是一组操作数据库的SQL语句组成的工作单元,该工作单元中所有操作要么同时成功,要么同时失败.事物有如下四个特性,ACID简称“酸性”. 1)原子性:工作单元中所有的操作要么 ...

  2. ubuntu built-in display 产生的一个原因

    在没有禁用开源的显卡驱动 nouveau 下,从 apt 安装了nvidia的驱动,导致了后面开机后,系统不能正确的识别到显示器,整个界面分辨率变的非常小,在设置菜单中的显示设置中也不能调节分辨率,并 ...

  3. kali安装ssh服务

    一. kali安装ssh服务 1.修改源 root@DGG:~# vi /etc/apt/sources.list deb http://http.kali.org/kali kali-rolling ...

  4. JavaScript对象回收机制

    js维护了一张对象引用表: 当一个对象被创建以后,栈内就有一个a,a这个对象就指向了对这个地址,当a=new Person()执行后,引用次数加1.当a=null置空,引用次数减1.由系统来维护对象引 ...

  5. py2exe安装使用

    一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...

  6. tcl之文件操作-文件名相关

  7. Redis ---------- 持久化(AOF)操作

    每小时做一次快照持久化 8:00 快照持久化 9:00 快照持久化 10:00  快照持久化  上帝想玩弄人类,突然停电,55万个key丢失了 11:00 快照持久化 解决方案: 8:00-9:00在 ...

  8. python中的字典内置方法小结

    #!/usr/local/bin/python3 # -*- coding:utf-8 -*- #key-value #dict 无序,无下标,不需要下标,因为有key stu={ 'stu001': ...

  9. POJ:2785-4 Values whose Sum is 0(双向搜索)

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 26974 Accepted: ...

  10. P1282

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...