poj2749
万变不离其宗
只要搞清楚题目的基本模型
搞清楚边是一种推导出的关系
搞清楚里面的逻辑关系
那就没什么难的了……
二分+sat,没什么好说的
const inf=;
type node=record
point,next:longint;
end;
var edge:array[..] of node;
v,f:array[..] of boolean;
x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[..] of longint;
sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint;
function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
function dis(i,j:longint):longint;
begin
exit(abs(x[i]-x[j])+abs(y[i]-y[j]));
end;
procedure add(x,y:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].next:=p[x];
p[x]:=len;
end;
procedure tarjan(x:longint);
var i,y:longint;
begin
inc(h);
inc(t);
dfn[x]:=h;
low[x]:=h;
f[x]:=true;
v[x]:=true;
st[t]:=x;
i:=p[x];
while i<>- do
begin
y:=edge[i].point;
if not v[y] then
begin
tarjan(y);
low[x]:=min(low[x],low[y]);
end
else if f[y] then low[x]:=min(low[x],low[y]);
i:=edge[i].next;
end;
if dfn[x]=low[x] then
begin
inc(sum);
while st[t+]<>x do
begin
y:=st[t];
f[y]:=false;
be[y]:=sum;
dec(t);
end;
end;
end;
function check(k:longint):boolean;
var i,x,y,j:longint;
begin
len:=;
fillchar(p,sizeof(p),);
fillchar(v,sizeof(v),false);
fillchar(st,sizeof(st),);
fillchar(be,sizeof(be),);
for i:= to a do
begin
x:=hx[i];
y:=hy[i];
add(x,y+n);
add(x+n,y);
add(y+n,x);
add(y,x+n);
end;
for i:= to b do
begin
x:=fx[i];
y:=fy[i];
add(x,y);
add(y,x);
add(x+n,y+n);
add(y+n,x+n);
end;
for i:= to n- do
for j:=i+ to n do
begin
if w1[i]+w1[j]>k then
begin
add(j,i+n);
add(i,j+n);
end;
if w2[i]+w2[j]>k then
begin
add(i+n,j);
add(j+n,i);
end;
if w1[i]+w+w2[j]>k then
begin
add(i,j);
add(j+n,i+n);
end;
if w2[i]+w+w1[j]>k then
begin
add(i+n,j+n);
add(j,i);
end;
end;
sum:=;
for i:= to *n do
if not v[i] then
begin
h:=;
t:=;
tarjan(i);
end;
for i:= to n do
if be[i]=be[i+n] then exit(false);
exit(true);
end;
begin
readln(n,a,b);
l:=inf;
r:=;
readln(x[n+],y[n+],x[n+],y[n+]);
w:=dis(n+,n+);
for i:= to n do
begin
readln(x[i],y[i]);
w1[i]:=dis(i,n+);
w2[i]:=dis(i,n+);
l:=min(l,min(w1[i],w2[i]));
r:=max(r,max(w1[i],w2[i]));
end;
r:=r shl +w;
for i:= to a do
readln(hx[i],hy[i]);
for i:= to b do
readln(fx[i],fy[i]);
ans:=inf;
while l<=r do
begin
m:=(l+r) shr ;
if check(m) then
begin
ans:=m;
r:=m-;
end
else l:=m+;
end;
if ans=inf then writeln(-) else writeln(ans);
end.
const inf=;
type node=record
point,next:longint;
end;
var edge:array[..] of node;
v,f:array[..] of boolean;
x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[..] of longint;
sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint;
function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
function dis(i,j:longint):longint;
begin
exit(abs(x[i]-x[j])+abs(y[i]-y[j]));
end;
procedure add(x,y:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].next:=p[x];
p[x]:=len;
end;
procedure tarjan(x:longint);
var i,y:longint;
begin
inc(h);
inc(t);
dfn[x]:=h;
low[x]:=h;
f[x]:=true;
v[x]:=true;
st[t]:=x;
i:=p[x];
while i<>- do
begin
y:=edge[i].point;
if not v[y] then
begin
tarjan(y);
low[x]:=min(low[x],low[y]);
end
else if f[y] then low[x]:=min(low[x],low[y]);
i:=edge[i].next;
end;
if dfn[x]=low[x] then
begin
inc(sum);
while st[t+]<>x do
begin
y:=st[t];
f[y]:=false;
be[y]:=sum;
dec(t);
end;
end;
end;
function check(k:longint):boolean;
var i,x,y,j:longint;
begin
len:=;
fillchar(p,sizeof(p),);
fillchar(v,sizeof(v),false);
fillchar(st,sizeof(st),);
fillchar(be,sizeof(be),);
for i:= to a do
begin
x:=hx[i];
y:=hy[i];
add(x,y+n);
add(x+n,y);
add(y+n,x);
add(y,x+n);
end;
for i:= to b do
begin
x:=fx[i];
y:=fy[i];
add(x,y);
add(y,x);
add(x+n,y+n);
add(y+n,x+n);
end;
for i:= to n- do
for j:=i+ to n do
begin
if w1[i]+w1[j]>k then
begin
add(j,i+n);
add(i,j+n);
end;
if w2[i]+w2[j]>k then
begin
add(i+n,j);
add(j+n,i);
end;
if w1[i]+w+w2[j]>k then
begin
add(i,j);
add(j+n,i+n);
end;
if w2[i]+w+w1[j]>k then
begin
add(i+n,j+n);
add(j,i);
end;
end;
sum:=;
for i:= to *n do
if not v[i] then
begin
h:=;
t:=;
tarjan(i);
end;
for i:= to n do
if be[i]=be[i+n] then exit(false);
exit(true);
end;
begin
readln(n,a,b);
l:=inf;
r:=;
readln(x[n+],y[n+],x[n+],y[n+]);
w:=dis(n+,n+);
for i:= to n do
begin
readln(x[i],y[i]);
w1[i]:=dis(i,n+);
w2[i]:=dis(i,n+);
l:=min(l,min(w1[i],w2[i]));
r:=max(r,max(w1[i],w2[i]));
end;
r:=r shl +w;
for i:= to a do
readln(hx[i],hy[i]);
for i:= to b do
readln(fx[i],fy[i]);
ans:=inf;
while l<=r do
begin
m:=(l+r) shr ;
if check(m) then
begin
ans:=m;
r:=m-;
end
else l:=m+;
end;
if ans=inf then writeln(-) else writeln(ans);
end.
poj2749的更多相关文章
- [POJ2749]Building roads(2-SAT)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8153 Accepted: 2772 De ...
- Poj2749:Building roads
题意 有 N 个牛栏,现在通过一条通道(s1,s2)要么连到s1,要么连到s2,把他们连起来,他们之间有一些约束关系,一些牛栏不能连在同一个点,一些牛栏必须连在同一个点,现在问有没有可能把他们都连好, ...
- POJ2749 Building roads
嘟嘟嘟 最近把21天漏的给不上. 今天重温了一下2-SAT,感觉很简单.就是把所有条件都转化成如果--必然能导出--.然后就这样连边建图,这样一个强连通分量中的所有点必然都是真或者假.从而根据这个点拆 ...
- POJ2749:Building roads——题解
http://poj.org/problem?id=2749 (这个约翰的奶牛真多事…………………………) i表示u与s1连,i+n表示u与s2连. 老规矩,u到v表示取u必须取v. 那么对于互相打架 ...
- POJ2749 Building roads 【2-sat】
题目 Farmer John's farm has N barns, and there are some cows that live in each barn. The cows like to ...
- POJ2749 Building road
传送门 这道题真是2-SAT好题啊!!卡了我两个点才做完……垃圾POJ还不告诉我哪错了…… 首先我们先花一段时间把题看懂……(其实是翻译一下),之后我们发现因为每个谷仓只能向一个中转点连边,所以他就是 ...
- POJ2749 题解
题目大意:有若干牛圈和两个连接起来的的中转点S1,S2.每个牛圈需要选择其中一个中转点与之连接,从而使任意两个牛圈能够连通.有若干对牛圈里的牛互相hate或是互相like.若两个牛圈里的牛互相hate ...
- 2-SAT 问题
2-SAT 问题是k-SAT问题在k==2时的特殊情况,因为已经证明k>=3时的k-sat问题属于npc问题.所以在这里仅研究2-SAT的特殊情况. 何为2-sat问题? 简单地说就是有N个 ...
- ACM训练计划step 2 [非原创]
(Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...
随机推荐
- html元素类型 块级元素、内联元素(又叫行内元素)和内联块级元素。
html中的标签元素大体被分为三种不同的类型:块级元素.内联元素(又叫行内元素)和内联块级元素. 块级元素特点: 1.每个块级元素都从新的一行开始,并且其后的元素也另起一行.(霸道,一个块级元素独占一 ...
- MyBatis拦截器:给参数对象属性赋值
该拦截器的作用:在进行增加.修改等操作时,给数据模型的一些通用操作属性(如:创建人.创建时间.修改人.修改时间等)自动赋值. 该实现是在DAO层拦截,即存入DB前最后一层.后经分析,不是很合理,改为在 ...
- QT宏 Q_OBJECT,explicit, QHostAddress, quint, emit
QT相關 一. 參考: 1.宏Q_OBJECT 二. explicit struct constrcution 三. QHostAddress Detailed Description: The QH ...
- 24种设计模式--中介者模式【Mediator Pattern】
各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...
- 如何自动拼接 Update语句,仅Update已修改的字段
我们通常使用update语句更新数据库记录,例如使用update user set username='001', nickname='Tom', age=18 where id = 1语句更新use ...
- jtemplate使用笔记
最近的项目中用到了jtemplate, 它是客户端基于javascript的模板引擎,绑定的数据为json对象.以前我在页面上显示数据列表时最喜欢用Repeater控件了,因为它相对与其它几个服务端控 ...
- mysql基本知识
最大连接数show variables max_connections; select VARIABLE_VALUE from information_schema.GLOBAL_VARIABLES ...
- python正则实例
# -*- coding: cp936 -*-import reidcardregex=r"^[1-9]\d{14}(\d{2}[0-9x])?$"print re.search( ...
- [PHP] chr和ord函数实现字符串和ASCII码互转
chr和ord函数是用来字符串和ASCII码互转的. ASCII码是计算机所能显示字符的编码,它的取值范围是0-255,其中包括标点.字母.数字.汉字等.在编程过程中,经常把指定的字符转化为ASCI ...
- 关于NRW算法(Quorum算法)
在分布式系统中,冗余数据是保证可靠性的手段,因此冗余数据的一致性维护就非常重要.一般而言,一个写操作必须要对所有的冗余数据都更新完成了,才能称为成功结束.比如一份数据在5台设备上有冗余,因为不知道读数 ...