[poj] 2749 building roads
原题
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的更多相关文章
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...
- poj 2749 Building roads (二分+拆点+2-sat)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6229 Accepted: 2093 De ...
- POJ 2749 Building roads 2-sat+二分答案
把爱恨和最大距离视为限制条件,可以知道,最大距离和限制条件多少具有单调性 所以可以二分最大距离,加边+check #include<cstdio> #include<algorith ...
- poj 3625 Building Roads
题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...
- poj 3625 Building Roads(最小生成树,二维坐标,基础)
题目 //最小生成树,只是变成二维的了 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> ...
- poj 2749
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6091 Accepted: 2046 De ...
- Building roads
Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- [POJ2749]Building roads(2-SAT)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8153 Accepted: 2772 De ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
随机推荐
- SHGetSpecialFolderLocation获取开始文件夹
SHGetSpecialFolderLocation函数可以获取windows 特殊目录 函数原型:(MSDN官方链接:https://msdn.microsoft.com/en-us/library ...
- 基于WSAAsyncSelect模型的两台计算机之间的通信
任务目标 编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递.客户端向服务器端发送"请输出从1到1000内所有 ...
- 谷歌浏览器如何调试JS
平常在开发过程中,经常会接触到前端页面.那么对于js的调试那可是家常便饭,谷歌浏览器是常用来调试JS代码的工具,本文主要介绍如何利用谷歌浏览器来调试JS代码,协助我们进行开发工作,加快开发效率. 1. ...
- 关于json输出为null?
原因: 该字符中含了ASCII码ETB控制符,即\x17导致json解析失败 解决方案: $params = preg_replace('/[\x00-\x1F]/', '', $params); ...
- openwrt(三) 固件的烧录
导航: 方法1: tftp: 方法2: 在线升级 方法3: BIOS烧录 方法1:TFTP 这应该是最万能的一种方法了.TFTP是一种依靠网口传送数据的一种通信协议,没错,只是传输数据,并不是烧录,所 ...
- P1219 N皇后
P1219 N皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
- 调整图像的亮度和对比度—opencv
1.理论基础 两个参数 和 一般称作 增益 和 偏置 参数.我们往往用这两个参数来分别控制 对比度 和 亮度 . 你可以把 看成源图像像素,把 看成输出图像像素.这样一来,上面的式子就能写得更 ...
- POJ:2739-Sum of Consecutive Prime Numbers(尺取)
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27853 Ac ...
- [Bzoj1034][ZJOI2008]泡泡堂BNB(贪心)
Description 题目链接 Solution 这题就是一个贪心, 如果最弱的能赢对方最弱的就赢 否则最强的能赢对面最强的就赢 否则最弱的换对面最强 Code #include <cstdi ...
- Oozie 实战之 shell
说明:使用 shell action 执行 shell 脚本 hive-select-test.sh 来通过已经配置好的 Hive -f 来执行 HQL 查询脚本文件 select.sql 1.创建脚 ...