嘟嘟嘟




最近把21天漏的给不上。




今天重温了一下2-SAT,感觉很简单。就是把所有条件都转化成如果……必然能导出……。然后就这样连边建图,这样一个强连通分量中的所有点必然都是真或者假。从而根据这个点拆点后的两个点是否在一个强连通分量里判断是否有解。




这题人很容易想到拆点:\(i\)表示\(i\)连向\(s_1\),\(i + n\)表示\(i\)连向\(s_2\)。

这道题关键在于距离这个限制。我们肯定能想到二分,但是接下来我就没想出来,因为2-SAT的图的边权是没有意义的。但实际上这个也是可以用2-SAT的思路解决的:比如\(dis(i, s_1) + dis(j, s_1) > mid\),那么就说明,如果\(i\)连了\(s_1\),\(j\)只能连\(s_2\),因此我们连边\((i, j + n)\)。按照这种思路把四种情况都写一遍就行了。




这题和板子还有一个区别就是,板子给的条件形如"如果\(i\)为真,则\(j\)为假",也就是说,每一点的真假已知。但这到题真假不定,所以都得讨论。也就是说,对于每一个讨厌和喜欢关系,都得连4条边。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 5e2 + 5;
const int maxe = 5e6 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n, A, B;
struct Node
{
int x, y;
friend In int dis(Node& A, Node& B)
{
return abs(A.x - B.x) + abs(A.y - B.y);
}
}s[2], p[maxn], a[maxn << 1], b[maxn << 1];
int d[maxn << 1], DIS; struct Edge
{
int nxt, to;
}e[maxe];
int head[maxn << 1], ecnt = -1;
In void addEdge(int x, int y)
{
e[++ecnt] = (Edge){head[x], y};
head[x] = ecnt;
} In void build(int x)
{
for(int i = 1; i <= A; ++i)
{
int u = a[i].x, v = a[i].y;
addEdge(u, v + n), addEdge(v, u + n);
addEdge(u + n, v), addEdge(v + n, u);
}
for(int i = 1; i <= B; ++i)
{
int u = b[i].x, v = b[i].y;
addEdge(u, v), addEdge(u + n, v + n);
addEdge(v, u), addEdge(v + n, u + n);
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(i ^ j)
{
if(d[i] + d[j] > x)
addEdge(i, j + n), addEdge(j, i + n);
if(d[i + n] + d[j + n] > x)
addEdge(i + n, j), addEdge(j + n, i);
if(d[i] + d[j + n] + DIS > x)
addEdge(i, j), addEdge(j + n, i + n);
if(d[i + n] + d[j] + DIS > x)
addEdge(i + n, j + n), addEdge(j, i);
}
}
bool in[maxn << 1];
int dfn[maxn << 1], low[maxn << 1], cnt = 0;
int st[maxn << 1], top = 0, col[maxn << 1], ccol = 0;
In void dfs(int now)
{
dfn[now] = low[now] = ++cnt;
st[++top] = now; in[now] = 1;
for(int i = head[now], v; ~i; i = e[i].nxt)
{
if(!dfn[v = e[i].to])
{
dfs(v);
low[now] = min(low[now], low[v]);
}
else if(in[v]) low[now] = min(low[now], dfn[v]);
}
if(low[now] == dfn[now])
{
int x; ++ccol;
do
{
x = st[top--]; in[x] = 0;
col[x] = ccol;
}while(x ^ now);
}
}
In void init()
{
ecnt = -1;
for(int i = 1; i <= (n << 1); ++i)
dfn[i] = low[i] = col[i] = in[i] = 0, head[i] = -1;
cnt = top = ccol = 0;
}
In bool sat(int x)
{
init();
build(x);
for(int i = 1; i <= (n << 1); ++i) if(!dfn[i]) dfs(i);
for(int i = 1; i <= n; ++i)
if(col[i] == col[i + n]) return 0;
return 1;
} int main()
{
n = read(), A = read(), B = read();
s[0].x = read(), s[0].y = read(), s[1].x = read(), s[1].y = read();
for(int i = 1; i <= n; ++i) p[i].x = read(), p[i].y = read();
for(int i = 1; i <= A; ++i) a[i].x = read(), a[i].y = read();
for(int i = 1; i <= B; ++i) b[i].x = read(), b[i].y = read();
DIS = dis(s[0], s[1]);
for(int i = 1; i <= n; ++i) d[i] = dis(p[i], s[0]), d[i + n] = dis(p[i], s[1]);
int L = 0, R = 6e6;
while(L < R)
{
int mid = (L + R) >> 1;
if(sat(mid)) R = mid;
else L = mid + 1;
}
write(L == 6e6 ? -1 : L), enter;
return 0;
}

POJ2749 Building roads的更多相关文章

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

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

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

  3. poj 3625 Building Roads

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

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

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

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

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

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

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

  7. Building roads

    Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  8. bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...

  9. bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树

    1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer J ...

随机推荐

  1. python基础学习(五)while循环语句

    while循环基本使用 循环的作用就是让指定的代码重复的执行 while循环最常用的应用场景就是让执行的代码按照指定的次数重复执行 流程图 基本语法 初始条件设置 —— 通常是重复执行的 计数器 wh ...

  2. JavaScript定时器实现的原理分析

    原文链接:http://www.cnblogs.com/st-leslie/p/6082450.html 一.储备知识 在我们在项目中一般会遇见过这样的两种定时器,第一种是setTimeOut,第二种 ...

  3. 四个O(n^2)级别的排序性能测试

    测试环境为DEV-C++,并且选择排序,插入排序,冒泡排序,均为优化后的,若想了解具体优化过程,请参照:https://blog.csdn.net/qq_40164152 测试用例: #ifndef ...

  4. 真实世界的脉络].(英)戴维.多伊奇.pdf

    [真实世界的脉络].(英)戴维.多伊奇.pdf 宇宙.时间.生命.等等,如果用量子物理学.计算机科学.进化论.认识论将这些最基本而又复杂的问题纠缠在一起时,那将会是一幅什么样的图景呢?也许,我们穷尽一 ...

  5. SPOJ7258 SUBLEX - Lexicographical Substring Search(后缀自动机)

    Little Daniel loves to play with strings! He always finds different ways to have fun with strings! K ...

  6. 一位ML工程师构建深度神经网络的实用技巧

    一位ML工程师构建深度神经网络的实用技巧 https://mp.weixin.qq.com/s/2gKYtona0Z6szsjaj8c9Vg 作者| Matt H/Daniel R 译者| 婉清 编辑 ...

  7. Android项目实战(五十一):浅谈GreenDao

    比较出名的数据库框架 GreenDao使用步骤: 1.app目录下的build.gradle文件 添加依赖 compile 'org.greenrobot:greendao:3.2.0' 顶部添加插件 ...

  8. eclipse安装其他颜色主题包

    eclipse安装其他颜色主题包: 用Help-Install new software安装的时候,work with的URL是 http://eclipse-color-theme.github.c ...

  9. webpack项目轻松混用css module

    前言 本文讲述css-loader开启css模块功能之后,如何与引用的npm包中样式文件不产生冲突. 比如antd-mobilenpm包的引入.在不做特殊处理的前提下,样式文件将会被转译成css mo ...

  10. Scala链式编程内幕

    package big.data.analyse.scala /** * 链式编程原理 * Created by zhen on 2018/12/16. */ class Computer{def c ...