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. javaweb(四)——Http协议(请求头,响应头详解)

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  2. Java开发工程师(Web方向) - 04.Spring框架 - 第1章.Spring概述

    第1章.Spring概述 Spring概述 The Spring Framework is a lightweight solution and a potential one-stop-shop f ...

  3. [SHELL]退出脚本

    一,退出状态码 1,范围:0~255 2,查看退出状态码:必须在命令执行之后立即执行 ,显示的是脚本最后一条命令的退出状态码 echo $? 若f返回值为0,则表示正常 有异常为正值 二,exit 脚 ...

  4. JDK源码分析:Byte.java

    Byte是基本数据类型byte的包装类. 1)声明部分: public final class Byte extends Number implements Comparable<Byte> ...

  5. Halcon介绍和下载安装视频教程

    ------------------------Halcon,Visionpro高清视频教程,点击下载视频--------------------------

  6. 使用深度学习来破解 captcha 验证码(转)

    使用深度学习来破解 captcha 验证码 本项目会通过 Keras 搭建一个深度卷积神经网络来识别 captcha 验证码,建议使用显卡来运行该项目. 下面的可视化代码都是在 jupyter not ...

  7. Hadoop源码解析 1 --- Hadoop工程包架构解析

    1 Hadoop中各工程包依赖简述     Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施.     GoogleCluster: http:// ...

  8. Pandas dataframe数据写入文件和数据库

    转自:http://www.dcharm.com/?p=584 Pandas是Python下一个开源数据分析的库,它提供的数据结构DataFrame极大的简化了数据分析过程中一些繁琐操作,DataFr ...

  9. [git] Git in Practice

    Work flow with git and github Work with Remotes Check the current status git status Check the latest ...

  10. Java学习个人备忘录之接口

    abstract class AbsDemo { abstract void show1(); abstract void show2(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...