[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 ...
随机推荐
- 原生Ajax发送请求
ajax get&post 1.使用get发送请求,会有请求缓存 1)什么叫请求缓存,请求信息相同浏览器不会再向服务器发送请求,导致访问服务器失败. 2)解决:将随机数添加到请求路径后面参数 ...
- JS - 给String.prototype添加replaceAll方法
String.prototype.replaceAll = function (targetStr, newStr) { var sourceStr = this.valueOf(); while ...
- Linux帮助都有哪几种,如何使用?
帮助文件有2类,内置命令和外部命令. 其中内置命令就是shell内核自带的,因为shell当中自己要进行管理,那么就需要一些命令进行管理,不同的shell肯定有不同的shell命令,我们用type命令 ...
- Go HTTP模块处理流程简析
Go语言提供完善的net/http包,用户使用起来非常方便简单,只需几行代码就可以搭建一个简易的Web服务,可以对Web路由.静态文件.cookie等数据进行操作. 一个使用http包建立的Web服务 ...
- 【Codebase】JQuery获取表单部分数据提交方法
JQuery使用ajax提交整个表单最简便的方法就是$('#form').serialize();但如果仅想保存表单中的部分数据,比如仅更新选中的条目,那么获取数据就比较麻烦了. 解决方法:新建一个表 ...
- scrapy--selenium
一直在学习scrapy的爬虫知识,但是遇到了动态加载页面的难题,从一开始的javascript渲染器--splash,docker服务, 遇到各种奇葩的问题: 1.docker代理设置添加无效,导致无 ...
- yii自定义行为组件(简介版)
yii2 给框架底层预定义事件自定义处理程序. 1. common\config\main.php 修改配置文件添加 'as behaviors' => 'backend\behavior ...
- ASPX页面请求响应过程
- 华为模拟器ensp安装教程
华为模拟器说实话有时候真的是很烦人,总是莫名其妙的出问题,而且网上教程一般也解决不了 因此我认为学会ensp的重装真的很重要,因此只要我们删除干净了,安装最多花不了20分钟的时间 接下来我就来说说怎么 ...
- [Luogu3806]点分治
询问树上是否存在距离为k[i]的点对 直接点分治把所有距离预处理出来,然后O(1)回答即可 Code #include <cstdio> #include <algorithm> ...