HDU1815 Building roads(二分+2-SAT)
Clever John just had another good idea. He first builds two transferring point S1 and S2, and then builds a road connecting S1 and S2 and N roads connecting each barn with S1 or S2, namely every barn will connect with S1 or S2, but not both. So that every pair of barns will be connected by the roads. To make the cows don't spend too much time while dropping around, John wants to minimize the maximum of distances between every pair of barns.
That's not the whole story because there is another troublesome problem. The cows of some barns hate each other, and John can't connect their barns to the same transferring point. The cows of some barns are friends with each other, and John must connect their barns to the same transferring point. What a headache! Now John turns to you for help. Your task is to find a feasible optimal road-building scheme to make the maximum of distances between every pair of barns as short as possible, which means that you must decide which transferring point each barn should connect to.
We have known the coordinates of S1, S2 and the N barns, the pairs of barns in which the cows hate each other, and the pairs of barns in which the cows are friends with each other.
Note that John always builds roads vertically and horizontally, so the length of road between two places is their Manhattan distance. For example, saying two points with coordinates (x1, y1) and (x2, y2), the Manhattan distance between them is |x1 - x2| + |y1 - y2|.
Next line contains 4 integer sx1, sy1, sx2, sy2, which are the coordinates of two different transferring point S1 and S2 respectively.
Each of the following N line contains two integer x and y. They are coordinates of the barns from the first barn to the last one.
Each of the following A lines contains two different integers i and j(1 <= i < j <= N), which represent the i-th and j-th barns in which the cows hate each other.
The same pair of barns never appears more than once.
Each of the following B lines contains two different integers i and j(1 <= i < j <= N), which represent the i-th and j-th barns in which the cows are friends with each other. The same pair of barns never appears more than once.
You should note that all the coordinates are in the range [-1000000, 1000000].
思路是没有问题的,但是写的有点丑,很多地方还可以合并。一开始思路就没有问题的,但是这种题就是找bug很头疼。QwQ!
结果是maxn开了510,忘记了两倍,晕死了。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=;
const int B=;
const int R=;
const int W=;
vector<int>G[maxn];
vector<int>G2[maxn];
int dis[][maxn],Dis;//Dis是S点,T点
int x,y,x1,y1,x2,y2,a,b,n,ans;
int col[maxn],q[maxn],num;
void init()
{
for(int i=;i<=*n;i++) G[i].clear();
for(int i=;i<=*n;i++) G2[i].clear();
ans=-;
}
void scan()
{
int i;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
Dis=abs(x1-x2)+abs(y1-y2);
for(i=;i<=n;i++){
scanf("%d%d",&x,&y);
dis[][i]=abs(x-x1)+abs(y-y1);
dis[][i]=abs(x-x2)+abs(y-y2);
}
for(i=;i<=a;i++){
scanf("%d%d",&x,&y);
G[x].push_back(y+n);
G[x+n].push_back(y);
G[y].push_back(x+n);
G[y+n].push_back(x);
}
for(i=;i<=b;i++){
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
G[x+n].push_back(y+n);
G[y+n].push_back(x+n);
} }
bool dfs(int u)
{
if(col[u]==R) return false;
if(col[u]==B) return true;
col[u]=B;
col[u>n?u-n:u+n]=R;
q[++num]=u;
for(int i=;i<G[u].size();i++) if(!dfs(G[u][i])) return false;
for(int i=;i<G2[u].size();i++) if(!dfs(G2[u][i])) return false;
return true;
}
bool check(int x)
{
int i,j;
for(i=;i<=n;i++) if(dis[][i]>x&&dis[][i]>x) return false;
for(i=;i<=*n;i++) G2[i].clear();
for(i=;i<=*n;i++) col[i]=;
for(i=;i<=n;i++)
for(j=i+;j<=n;j++){
int d1=dis[][i]+dis[][j];
int d2=dis[][i]+dis[][j]+Dis;
int d3=dis[][i]+dis[][j];
int d4=dis[][i]+dis[][j]+Dis;
if(d1>x&&d2>x&&d3>x&&d4>x) return false;
if(d1>x){
G2[i].push_back(j+n);
G2[j].push_back(i+n);
}
if(d2>x){
G2[i].push_back(j);
G2[j+n].push_back(i+n);
}
if(d3>x){
G2[i+n].push_back(j);
G2[j+n].push_back(i);
}
if(d4>x){
G2[i+n].push_back(j+n);
G2[j].push_back(i);
}
}
for(i=;i<=*n;i++){
if(col[i]) continue;
num=;
if(!dfs(i)){
for(j=;j<=num;j++) {
col[q[j]>n?q[j]-n:q[j]+n]=W;
col[q[j]]=W;
}
if(!dfs(i>n?i-n:i+n)) return false;
}
}
return true;
}
int main()
{
while(~scanf("%d%d%d",&n,&a,&b)){
init();
int L=,R=;
scan();
while(L<=R){
int mid=(L+R)>>;
if(check(mid)){ ans=mid;R=mid-;}
else L=mid+;
}
printf("%d\n",ans);
}
return ;
}
下面这样建图有些问题,读者可以思考一下。
if(d2<=x&&d1>x&&d3>x){
G2[i].push_back(j+n);
G2[j+n].push_back(i);
}
if(d1<=x&&d2>x&&d4>x){
G2[i].push_back(j);
G2[j].push_back(i);
}
if(d4<=x&&d3>x&&d1>x){
G2[i+n].push_back(j);
G2[j].push_back(i+n);
}
if(d3<=x&&d4>x&&d2>x){
G2[i+n].push_back(j+n);
G2[j+n].push_back(i+n);
}
HDU1815 Building roads(二分+2-SAT)的更多相关文章
- POJ Building roads [二分答案 2SAT]
睡觉啦 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...
- poj 2749 Building roads (二分+拆点+2-sat)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6229 Accepted: 2093 De ...
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...
- 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 3625 Building Roads
题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )
计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...
- bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...
- bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树
1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Description Farmer J ...
随机推荐
- 【转】Python爬虫(5)_性能相关
爬虫性能相关 一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,采用串行的方式执行,只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是: ...
- api响应类
接口开发响应类封装 class response{ /* * 封通信接口数据 * @param integer $code 状态码 * @param string $message 状态信息 * @p ...
- JQuery Div层滚动条控制(模拟横向滚动条在最顶端显示)
想让DIV层滚动条显示在顶端,CSS样式没找到相关属性,于是用2个DIV层来模拟做了一个.经测试IE浏览器上显示并不太美观!不知道是否还有更好的办法可以实现这功能呢? aaaaaaasssssss ...
- Python学习进程(12)模块
模块让你能够有逻辑地组织你的Python代码段. (1)python模块: 模块化的好处: 1.把相关的代码分配到一个模块里能让你的代码更好用,更易懂. 2.模块也是Python对象, ...
- 使用git从本地上传至git码云远程仓库
从 http://git-scm.com/download 下载window版的客户端.下载好,一步一步安装即可. 使用前的基本设置 git config --global user.name & ...
- [原创]spring及springmvc精简版--AOP
接上一篇:[原创]spring及springmvc精简版--IOC 理解AOP.java是一种面向对象的语言.而AOP是面向切面,在我看来是面向逻辑或者业务编程,它是对一组逻辑的抽象和分配. 经典例子 ...
- 【Head First Servlets and JSP】笔记13:session & cookie
session的接口 杀死会话 cookie的性质 cookie的接口 再总结——cookie.session.JSESSIONID的前世今生 简单的定制cookie示例 1.session的接口,配 ...
- R中的参数传递函数:commandArgs(),getopt().
1.commandArgs(),是R自带的参数传递函数,属于位置参数. ##test.R args=commandArgs(T) print (args[1])##第一个外部参数 print (arg ...
- Linux 多线程编程实例
一.多线程 VS 多进程 和进程相比,线程有很多优势.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护代码段和数据.而运行于一个进程中的多个线程,他们之间使用相同 ...
- HTTP与HTTPS有什么区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用 ...