[poj] 2749 building roads
原题
2-SAT+二分答案!
最小的最大值,这肯定是二分答案。而我们要2-SATcheck是否在该情况下有可行解。
对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来实现连边,然后跑2-SAT判断是否有可行解
O(n^2logn)
想起来和听起来都很难写,事实上还好吧…
#include<cstdio>
#include<algorithm>
#include<stack>
#include<cstring>
#define inf 97797977
#define N 510
using namespace std;
int n,m,A,B,lovex[2*N],lovey[2*N],hatex[2*N],hatey[2*N],dis1[N],dis2[N],dis,sx1,sx2,sy1,sy2,x[N],y[N],head[2*N];
int bel[2*N],cnt=1,l,r=inf,dfn[2*N],low[2*N],t,mid,sum;
stack <int> stk;
bool instk[2*N];
struct hhh
{
int to,next;
}edge[10*N*N];
int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
void add(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
bool build()
{
for (int i=1;i<=B;i++)
{
add(lovex[i],lovey[i]);
add(lovey[i],lovex[i]);
add(lovex[i]+n,lovey[i]+n);
add(lovey[i]+n,lovex[i]+n);
}
for (int i=1;i<=A;i++)
{
add(hatex[i],hatey[i]+n);
add(hatex[i]+n,hatey[i]);
add(hatey[i]+n,hatex[i]);
add(hatey[i],hatex[i]+n);
}
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
{
int t=0;
if (dis1[i]+dis+dis2[j]>mid)
{
add(i,j);
add(j+n,i+n);
t++;
}
if (dis2[i]+dis+dis1[j]>mid)
{
add(i+n,j+n);
add(j,i);
t++;
}
if (dis1[i]+dis1[j]>mid)
{
add(i,j+n);
add(j,i+n);
t++;
}
if (dis2[i]+dis2[j]>mid)
{
add(i+n,j);
add(j+n,i);
t++;
}
if (t==4) return 0;
}
return 1;
}
void Tarjan(int u)
{
dfn[u]=low[u]=++t;
stk.push(u);
instk[u]=1;
for (int i=head[u],v;i;i=edge[i].next)
{
v=edge[i].to;
if (!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (instk[v]) low[u]=min(low[u],dfn[v]);
}
if (low[u]==dfn[u])
{
sum++;
int t;
do
{
t=stk.top();
bel[t]=sum;
stk.pop();
instk[t]=0;
}while(t!=u);
}
}
bool check()
{
for (int i=1;i<=n;i++)
if (bel[i]==bel[i+n]) return 0;
return 1;
}
int get1(int i)
{
return abs(sx1-x[i])+abs(sy1-y[i]);
}
int get2(int i)
{
return abs(sx2-x[i])+abs(sy2-y[i]);
}
int main()
{
n=read();
A=read();
B=read();
sx1=read();
sy1=read();
sx2=read();
sy2=read();
dis=abs(sx1-sx2)+abs(sy1-sy2);
for (int i=1;i<=n;i++)
{
x[i]=read();
y[i]=read();
}
for (int i=1;i<=A;i++)
{
hatex[i]=read();
hatey[i]=read();
}
for (int i=1;i<=B;i++)
{
lovex[i]=read();
lovey[i]=read();
}
for (int i=1;i<=n;i++)
{
dis1[i]=get1(i);
dis2[i]=get2(i);
}
while (l<r)
{
mid=(l+r)>>1;
cnt=1;
memset(dfn,0,sizeof(dfn));
memset(bel,0,sizeof(bel));
memset(head,0,sizeof(head));
if (build())
{
t=1;
sum=1;
for (int i=1;i<=2*n;i++)
if (!dfn[i]) Tarjan(i);
if (check()) r=mid;
else l=mid+1;
}
else l=mid+1;
}
printf("%d",l>=inf?-1:l);
return 0;
}
[poj] 2749 building roads的更多相关文章
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...
- poj 2749 Building roads (二分+拆点+2-sat)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6229 Accepted: 2093 De ...
- POJ 2749 Building roads 2-sat+二分答案
把爱恨和最大距离视为限制条件,可以知道,最大距离和限制条件多少具有单调性 所以可以二分最大距离,加边+check #include<cstdio> #include<algorith ...
- poj 3625 Building Roads
题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...
- poj 3625 Building Roads(最小生成树,二维坐标,基础)
题目 //最小生成树,只是变成二维的了 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> ...
- poj 2749
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6091 Accepted: 2046 De ...
- Building roads
Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- [POJ2749]Building roads(2-SAT)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8153 Accepted: 2772 De ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
随机推荐
- ElasticSearch High Level REST API【7】聚合
获取平均值聚合示例,最大值.最小值.求和类似 public void aggregation(){ RestHighLevelClient client = elasticClient.getRest ...
- MySQL 5.7基于GTID的主从复制环境搭建(一主一从)
Preface As wel all know,replication base on GTID with row format of binary log is comprehens ...
- zip压缩工具,unzip解压缩工具
zip压缩工具,unzip解压缩工具=================== [root@aminglinux tmp]# yum install -y zip[root@aminglinux tmp] ...
- 将 cmd 中命令输出内容保存为 TXT 文本文件
如果执行的命令输出内容较多,那么 cmd 控制台将会自动清除前面的内容,那么如何将屏幕的所有内容导出到文本文件? 下面给出简单的演示例子 ping百度,不会自动结束,按 Ctrl+C 强制结束,pin ...
- 封装动态数组类Array
功能: 1.增.删.改.查 2.扩容.缩容 3.复杂度分析 4.均摊复杂度 5.复杂度震荡 分析动态数组的时间复杂度: 分析resize的时间复杂度: public class Array<E& ...
- nuxt.config有关router配置
这里只说明一个属性,其他属性移步官方文档 https://zh.nuxtjs.org/api/configuration-router extendRoutes 官方说明: 你可以通过 exten ...
- dts--tests(四)
unit_tests.py """ DPDK Test suite. This TestSuite runs the unit tests included in DPD ...
- 1014-34-首页15-计算原创微博的frame------计算cell的高度---计算 UILabel 的 CGSize 的方法
一.总体思路: 在控制器中,每次拿到数据模型(请求了数据.加载新微博)的时候,就调用 - (NSArray *)stausFramesWithStatuses:(NSArray *)statuses, ...
- 第五章 标准I/O
5.1 引言 本章说明标准 I/O 库.因为不仅在 UNIX 上,而且在很多操作系统上都实现了此库,所以它由 ISO C 标准说明. 标准 I/O 库处理很多细节,例如缓冲区分配,以优化长度执行 I/ ...
- [Uva11178]Morley's Theorem(计算几何)
Description 题目链接 Solution 计算几何入门题 只要求出三角形DEF的一个点就能推出其他两个点 把一条边往内旋转a/3度得到一条射线,再做一条交点就是了 Code #include ...