嘟嘟嘟




最近把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. Java学习笔记之——常用类

    Random,String,Math 1.Random Random()  创建一个新的随机数生成器 案例:产生3个5-10的随机数 运行结果 注意:   2.StingBuffer,StringBu ...

  2. C# SqlBulkCopy类批量导入 测试

    一.功能说明 1.可以选择,只导入部分列,或者导入全部列. 2.导入速度的确比一般sql要快. 3.不用写sql语句 ----------------------------------------- ...

  3. Linux 进程调度的主要策略

    1.Linux 下进程分为5种类别,分别是停止类.截止类.实时类.公平类.空闲类, 每种类别都有一个运行队列,每次调度时,就是先按照类别优先级排序,再按照每个类别内的最高优先级任务调度运行. 文件:c ...

  4. weui textarea超出字符被截断

    HTML: <div class="weui-cells weui-cells_form" style="margin-top: 0;"> < ...

  5. Android 7.0 fiddler代理抓不到https请求的解决办法

    解决方法:  1.在源码res目录下新建xml目录,增加network_security_config.xml文件 (工程名/app/src/main/res/xml/network_security ...

  6. linux tmp清理这些事

    tmp目录 首先看下FHS的定义. FHS(Filessystem Hierarchy Standard) 的重点在于规范每个特定的目录下应该要放置什么样子的数据. tmp约定的存放内容 /tmp 这 ...

  7. 自动化测试基础篇--Selenium简单的163邮箱登录实例

    摘自https://www.cnblogs.com/sanzangTst/p/7472556.html 前面几篇内容一直讲解Selenium Python的基本使用方法.学习了什么是selenium: ...

  8. 一套简单的git版本控制代码

    对于博客来说,我还是直接实践比较好,理论过多,不方便以后的查看 废话不多,直接开干 功能需求: .公司需要将jenkins打包出来的压缩包通过git上传到git服务器 .而且通过版本控制上传的文件,即 ...

  9. 信号量的基本概念与使用semget,semop

    1.信号量的基本概念 信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源的同步访问. 临界资源可以简单的理解为在某一时刻只能由一个进程或线程进行操作的资源,这里的资源 可以是一段代码 ...

  10. f.lux 自动调节显示器色温

    我的环境 f.lux 我的使用感受是让屏幕看起来舒服一些,因为我有近视,所以需要保护眼睛. f.lux官网:https://justgetflux.com/ f.lux v4.47 windows 1 ...