http://poj.org/problem?id=2749

(这个约翰的奶牛真多事…………………………)

i表示u与s1连,i+n表示u与s2连。

老规矩,u到v表示取u必须取v。

那么对于互相打架的奶牛u,v,有:

add(u,v+n);add(v,u+n);

add(u+n,v);add(v+n,u);

对于互为朋友的奶牛u,v,有:

add(u,v);add(v,u);

add(u+n,v+n);add(v+n,u+n);

但这远远不够,我们需要求最大值最小……

二分?但是我们怎么边处理矛盾边的距离?

那么我们也想把连边处理成冲突。

对于奶牛i,j,sxy表示i到x到y到j的距离,mid是我们二分的最大值最小。

那么显然,对于s>mid,那么一定是矛盾的,此时明显我们要采取相反的方法。

因为我们i和j的循环方式都是1-n,所以我们使i不变,把j变一下即可。

用代码表示就是:

if(s11>mid)add(i,j+n);
if(s12>mid)add(i,j);
if(s21>mid)add(i+n,j+n);
if(s22>mid)add(i+n,j);

(然而我还是查了题解的……我真菜)

#include<stack>
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
inline int read(){
int x=,w=;char ch=;
while(ch<''||ch>''){if(ch=='-')w=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*w;
}
const int N=;
const int M=;
struct cow{
int x;
int y;
}e[N],s[];
struct node{
int to;
int nxt;
}edge[M];
struct wzh{
int u;
int v;
}aa[],bb[];
int head[N*],dfn[N*],low[N*],to[N*];
int t,l,cnt;
bool instack[N*];
stack<int>q;
inline void add(int u,int v){
cnt++;
edge[cnt].to=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
return;
}
void tarjan(int u){
t++;
dfn[u]=t;
low[u]=t;
q.push(u);
instack[u]=;
for(int i=head[u];i!=;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(instack[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
int v;
l++;
do{
v=q.top();
q.pop();
instack[v]=;
to[v]=l;
}while(v!=u);
}
return;
}
inline int dis(int a,int k1,int k2,int b){
return
abs(s[k1].x-e[a].x)+abs(s[k1].y-e[a].y)+
abs(s[k1].x-s[k2].x)+abs(s[k1].y-s[k2].y)+
abs(s[k2].x-e[b].x)+abs(s[k2].y-e[b].y);
}
inline void clr(){
cnt=;l=;t=;
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
return;
}
int n,ans=-;
int a,b;
void erfen(int l,int r){
if(l>r)return;
clr();
int mid=(l+r)>>;
for(int i=;i<=a;i++){
int u=aa[i].u;int v=aa[i].v;
add(u,v+n);add(v,u+n);
add(u+n,v);add(v+n,u);
}
for(int i=;i<=b;i++){
int u=bb[i].u;int v=bb[i].v;
add(u,v);add(v,u);
add(u+n,v+n);add(v+n,u+n);
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j)continue;
int s11=dis(i,,,j),s12=dis(i,,,j),
s21=dis(i,,,j),s22=dis(i,,,j);
if(s11>mid)add(i,j+n);
if(s12>mid)add(i,j);
if(s21>mid)add(i+n,j+n);
if(s22>mid)add(i+n,j);
}
}
for(int i=;i<=n*;i++){
if(!dfn[i])tarjan(i);
}
for(int i=;i<=n;i++){
if(to[i]==to[i+n]){
erfen(mid+,r);
return;
}
}
ans=mid;
erfen(l,mid-);
return;
}
//i表示与s1连,i+n表示与s2连
int main(){
n=read();a=read();b=read();
s[].x=read();s[].y=read();s[].x=read();s[].y=read();
for(int i=;i<=n;i++){
e[i].x=read();
e[i].y=read();
}
for(int i=;i<=a;i++){
aa[i].u=read();
aa[i].v=read();
}
for(int i=;i<=b;i++){
bb[i].u=read();
bb[i].v=read();
}
erfen(,);
printf("%d\n",ans);
return ;
}

POJ2749:Building roads——题解的更多相关文章

  1. [POJ2749]Building roads(2-SAT)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8153   Accepted: 2772 De ...

  2. 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  3. 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 ...

  4. POJ2749 Building roads

    嘟嘟嘟 最近把21天漏的给不上. 今天重温了一下2-SAT,感觉很简单.就是把所有条件都转化成如果--必然能导出--.然后就这样连边建图,这样一个强连通分量中的所有点必然都是真或者假.从而根据这个点拆 ...

  5. USACO Building Roads

    洛谷 P2872 [USACO07DEC]道路建设Building Roads 洛谷传送门 JDOJ 2546: USACO 2007 Dec Silver 2.Building Roads JDOJ ...

  6. poj 3625 Building Roads

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

  7. poj 2749 Building roads (二分+拆点+2-sat)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6229   Accepted: 2093 De ...

  8. BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )

    计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...

  9. HDU 1815, POJ 2749 Building roads(2-sat)

    HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...

随机推荐

  1. FreeRTOS的信号量和互斥量

    1. 理解如下,言简意赅的说,信号量解决同步,互斥量解决竞争. 信号量用于同步,主要任务间和中断间同步:互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁. 互斥量具有优先级继承,信 ...

  2. 【完美解决】Spark-SQL、Hive多 Metastore、多后端、多库

    [完美解决]Spark-SQL.Hive多 Metastore.多后端.多库 [完美解决]Spark-SQL.Hive多 Metastore.多后端.多库 SparkSQL 支持同时连接多种 Meta ...

  3. Java enum类型笔记

    用途: 定义命令行参数,菜单选项,星期,方向(东西南北)等 与普通类的不同 有默认的方法 value() 每个enum类都已默认继承java.lang.Enum,所以enum类不能继承其他类 构造方法 ...

  4. [JSON].getObj( keyPath )

    语法:[JSON].getObj( keyPath ) 返回:[JSON] 说明:返回指定键名路径的JSON对象,指定键名路径不存在时返回空的toJson对象(强烈建议使用 [JSON].exists ...

  5. HADOOP docker(二):HDFS 高可用原理

        1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...

  6. [zt]手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  7. Java中的线程状态转换和线程控制常用方法

    Java 中的线程状态转换: [注]:不是 start 之后就立刻开始执行, 只是就绪了(CPU 可能正在运行其他的线程). [注]:只有被 CPU 调度之后,线程才开始执行, 当 CPU 分配给你的 ...

  8. LintCode-67.二叉树的中序遍历

    二叉树的中序遍历 给出一棵二叉树,返回其中序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [1,3,2]. 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 code /** ...

  9. Perfmon - 脚本自动监控

    PerfMon-Windows性能监视器是个好东西,可以辅助我们分析发生问题时间段服务器资源占用情况,但是部署性能计数器确实一个相当麻烦的事情,往往这种枯燥的事别人还做不了,只能由我们这些希望获取到P ...

  10. redis——持久化方式RDB与AOF分析

    https://blog.csdn.net/u014229282/article/details/81121214 redis两种持久化的方式 RDB持久化可以在指定的时间间隔内生成数据集的时间点快照 ...