传送门

这道题真是2-SAT好题啊!!卡了我两个点才做完……垃圾POJ还不告诉我哪错了……

首先我们先花一段时间把题看懂……(其实是翻译一下),之后我们发现因为每个谷仓只能向一个中转点连边,所以他就是一个布尔变量的两个取值。然后对于每个限制条件,其实就是^嘛!我们把他转换为合取范式之后建一下图。不过怎么计算最大距离最小值呢?看到这一幕想起二分答案……然后,然后就不会了……

我们再想一下,其实2-SAT里面,每个给定的限制特别要命,因为如果要没有限制随便瞎取都能合法,然后我们要限制一个最大距离……那我们不妨把连接之后距离大于当前值的两个谷仓加一个限制,使两者不能连边,这样我们再跑一遍2-SAT判断一下当前是否合法,然后改变二分的值就可以。

具体怎么加距离的限制,如果两个点通过某种连接方式之后不合法,我们就把其中一个向另一个的否定连边(一个点连接s1,s2),比如说第一个点连向s1,第二个点连向s2,如果这样是不合法的情况的话,那么我们强制性让第一个点连s2,第二个点连s1,这样建边就可以啦。

然而说着容易做着难……代码贼拉难写+忘记判断-1+不知道怎么建边……卡了两个小时。

Source Code
Problem: User: ifvisit
Memory: 6176K Time: 1657MS
Language: C++ Result: Accepted Source Code #include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define fill(x,y) memset(x,y,sizeof(x));
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int N = ;
const int INF = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} struct edge
{
int next,to,from;
}e[N]; struct node
{
int x,y;
}q[M]; struct relation
{
int a,b;
}ha[M],li[M]; int n,m,g,head[M],ecnt,dfn[M],low[M],stack[M],top,scc[M],a,b,c,d,dis1[M],dis2[M],len,idx,cnt;
int minn = ,maxn,ans;
int s1 = ,s2 = ;
bool vis[M]; void add(int x,int y)
{
e[++ecnt].to = y;
e[ecnt].from = x;
e[ecnt].next = head[x];
head[x] = ecnt;
}
int rev(int x)
{
return x > n ? x - n : x + n;
} int mht(int kx,int ky)
{
return abs(q[kx].x - q[ky].x) + abs(q[kx].y - q[ky].y);
} void clear()
{
memset(e,,sizeof(e));
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(scc,,sizeof(scc));
ecnt = idx = cnt = ;
} void build(int x)
{
rep(i,,m)
{
int r1 = ha[i].a,r2 = ha[i].b;
add(r1,r2+n),add(r1+n,r2),add(r2,r1+n),add(r2+n,r1);
}
rep(i,,g)
{
int r1 = li[i].a,r2 = li[i].b;
add(r1,r2),add(r2,r1),add(r1+n,r2+n),add(r2+n,r1+n);
}
rep(i,,n)
{
rep(j,i+,n)
{
int l1 = dis1[i],l2 = dis2[i],r1 = dis1[j],r2 = dis2[j];
if(l1 + r1 > x) add(i,j+n),add(j,i+n);
if(l2 + r2 > x) add(i+n,j),add(j+n,i);
if(l1 + r2 + len > x) add(i,j),add(j+n,i+n);
if(l2 + r1 + len > x) add(i+n,j+n),add(j,i);
}
}
} void tarjan(int x)
{
dfn[x] = low[x] = ++idx;
stack[++top] = x,vis[x] = ;
for(int i = head[x];i;i = e[i].next)
{
if(!dfn[e[i].to]) tarjan(e[i].to),low[x] = min(low[x],low[e[i].to]);
else if(vis[e[i].to]) low[x] = min(low[x],dfn[e[i].to]);
}
if(low[x] == dfn[x])
{
int p;
cnt++;
while((p = stack[top--]))
{
scc[p] = cnt,vis[p] = ;
if(p == x) break;
}
}
} void solve()
{
int l = ,r = ;
while(l < r)
{
bool flag = ;
int mid = (l+r) >> ;
clear(),build(mid);
rep(i,,n<<) if(!dfn[i]) tarjan(i);
rep(i,,n)
{
if(scc[i] == scc[i+n])
{
flag = ;
break;
}
}
if(flag) l = mid + ;
else r = mid;
}
if(l == || l == ) printf("-1\n");
else printf("%d\n",l);
} int main()
{
n = read(),m = read(),g = read();
q[s1].x = read(),q[s1].y = read(),q[s2].x = read(),q[s2].y = read();
len = abs(q[s2].y-q[s1].y) + abs(q[s2].x-q[s1].x);
rep(i,,n)
{
q[i].x = read(),q[i].y = read();
dis1[i] = mht(i,s1),dis2[i] = mht(i,s2);
}
rep(i,,m) ha[i].a = read(),ha[i].b = read();
rep(i,,g) li[i].a = read(),li[i].b = read();
solve();
return ;
}

POJ2749 Building road的更多相关文章

  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. POJ2749 Building roads

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

  4. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  5. mapbox 接入高德矢量地图实战

    Mapbox 作为现如今比较流行的地图框架为我们提供了漂亮的个性化地图,在平常的使用过程中可以方便的接入高德/谷歌等矢量切片地图.由于Mapbox地图数据来源于Open Street Map等国外厂商 ...

  6. Indexing Sensor Data

    In particular embodiments, a method includes, from an indexer in a sensor network, accessing a set o ...

  7. 使用随机森林实现OSM路网城市多车道信息提取

    Multilane roads extracted from the OpenStreetMap urban road network using random forests.,DOI:10.111 ...

  8. Poj2749:Building roads

    题意 有 N 个牛栏,现在通过一条通道(s1,s2)要么连到s1,要么连到s2,把他们连起来,他们之间有一些约束关系,一些牛栏不能连在同一个点,一些牛栏必须连在同一个点,现在问有没有可能把他们都连好, ...

  9. POJ2749:Building roads——题解

    http://poj.org/problem?id=2749 (这个约翰的奶牛真多事…………………………) i表示u与s1连,i+n表示u与s2连. 老规矩,u到v表示取u必须取v. 那么对于互相打架 ...

随机推荐

  1. 【转】WinAPI: CreateFontIndirect - 根据字体结构建立逻辑字体

    //声明: CreateFontIndirect( const p1: TLogFont {字体结构} ): HFONT; {返回新字体指针} //TLogFont 是 tagLOGFONTA 结构的 ...

  2. buf.entries()详解

    buf.entries() 返回:{Iterator} 从当前 Buffer 的内容中,创建并返回一个 [index, byte] 形式的迭代器. const buf = Buffer.from('b ...

  3. UVA 230 Borrowers (STL 行读入的处理 重载小于号)

    题意: 输入若干书籍和作者名字,然后先按作者名字升序排列,再按标题升序排列,然后会有3种指令,BORROW,RETURN, SHELVE. BORROW 和 RETURN 都会带有一个书名在后面,如: ...

  4. 6.0以上,SYSTEM_ALERT_WINDOW 权限的问题

    6.0以上会因为SYSTEM_ALERT_WINDOW权限的问题,无法在最上层显示. 用户打开软件设置页手动打开,才能授权.路径是:Settings->Apps->App Setting- ...

  5. 九度oj 题目1070:今年的第几天?

    题目1070:今年的第几天? 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6832 解决:3779 题目描述: 输入年.月.日,计算该天是本年的第几天. 输入: 包括三个整数年(1< ...

  6. jquery动态绑定元素

    按照正常给静态元素绑定事件的写法换成给动态元素绑定事件会不管用,要用下面的方式: 简单说就是给要绑定元素的父元素绑定事件,参数中指明要绑定该父元素下面的哪个元素就行,这样就不管你这个元素是不是新增的, ...

  7. [BZOJ2462] [BeiJing2011]矩阵模板(二维Hash)

    传送门 二维哈希即可. 注意质数选的大一些,不然会超时. 还有插入的时候不判重居然比判重要快.. ——代码 #include <cstdio> int main() { ; ") ...

  8. topcoder SRM 639 div2

    见这里 http://ygdtc.sinaapp.com/?p=257

  9. hrbust 1840 (树状数组第k大) 删点使用

    小橙子 Time Limit: 2000 MS Memory Limit: 32768 K Total Submit: 2(2 users) Total Accepted: 1(1 users) Ra ...

  10. noip模拟赛 道路分组

    分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后dfs判断一下1和n是否连通.有向图的判连通没有什么很快的方法,特别注意,并查集是错的!这个算法可以得到60分. 事实上每一次都不需 ...