poj 2749
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 6091 | Accepted: 2046 |
Description
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|.
Input
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].
Output
Sample Input
4 1 1
12750 28546 15361 32055
6706 3887
10754 8166
12668 19380
15788 16059
3 4
2 3
Sample Output
53246
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack> using namespace std; const int MAX_N = ;
int N,M,A,B;
bool fri[MAX_N][MAX_N],hate[MAX_N][MAX_N];
int low[MAX_N * ],pre[MAX_N * ],cmp[MAX_N * ];
int dfs_clock,scc_cnt;
int x[MAX_N],y[MAX_N];
stack<int> S;
vector<int> G[ * MAX_N]; void dfs(int u) {
low[u] = pre[u] = ++dfs_clock;
S.push(u);
for(int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(!pre[v]) {
dfs(v);
low[u] = min(low[u],low[v]);
} else if(!cmp[v]) {
low[u] = min(low[u],pre[v]);
}
} if(low[u] == pre[u]) {
++scc_cnt;
for(;;) {
int x = S.top(); S.pop();
cmp[x] = scc_cnt;
if(x == u) break;
}
}
} bool scc() {
dfs_clock = scc_cnt = ;
memset(cmp,,sizeof(cmp));
memset(pre,,sizeof(pre)); for(int i = ; i <= * N + ; ++i) if(!pre[i]) dfs(i); for(int i = ; i <= N + ; ++i) {
if(cmp[i] == cmp[N + i]) return false;
}
return true;
} int dis(int i,int j) {
return abs(x[i] - x[j]) + abs(y[i] - y[j]);
} void build(int x) {
for(int i = ; i <= * N + ; ++i) {
G[i].clear();
} for(int i = ; i <= N + ; ++i) {
for(int j = i + ; j <= N + ; ++j) {
if(fri[i][j]) {
G[i].push_back(j);
G[i + N].push_back(j + N);
G[j].push_back(i);
G[j + N].push_back(i + N);
}
if(hate[i][j]) {
G[i].push_back(j + N);
G[j].push_back(i + N);
G[j + N].push_back(i);
G[i + N].push_back(j);
} if(dis(i,) + dis(j,) > x) {
G[i].push_back(j + N);
G[j].push_back(i + N);
}
if(dis(i,) + dis(j,) > x) {
G[i + N].push_back(j);
G[j + N].push_back(i);
}
if(dis(i,) + dis(j,) + dis(,) > x) {
G[i + N].push_back(j + N);
G[j].push_back(i);
}
if(dis(i,) + dis(j,) + dis(,)> x) {
G[i].push_back(j);
G[j + N].push_back(i + N);
}
}
} }
void solve() {
int l = ,r = 12e6 + ; //printf("r = %d\n",r); while(l < r) {
int mid = (l + r) / ;
build(mid);
if(scc()) r = mid;
else l = mid + ;
}
build(l);
if(scc())
printf("%d\n",l);
else
printf("-1\n");
} int main()
{
//freopen("sw.in","r",stdin);
scanf("%d%d%d",&N,&A,&B);
for(int i = ; i <= N + ; ++i) {
scanf("%d%d",&x[i],&y[i]);
} for(int i = ; i <= A; ++i) {
int a,b;
scanf("%d%d",&a,&b);
hate[a + ][b + ] = ;
} for(int i = ; i <= B; ++i) {
int a,b;
scanf("%d%d",&a,&b);
fri[a + ][b + ] = ;
} solve(); return ;
}
poj 2749的更多相关文章
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...
- Java实现 POJ 2749 分解因数(计蒜客)
POJ 2749 分解因数(计蒜客) Description 给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * - * an,并且1 < a1 <= ...
- poj 2749 Building roads (二分+拆点+2-sat)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6229 Accepted: 2093 De ...
- poj 2749 2-SAT问题
思路:首先将hate和friend建边求其次2-SAT问题,判断是否能有解,没解就输出-1,否则用二分枚举最大的长度,将两个barn的距离小于mid的看做是矛盾,然后建边,求2-SAT问题.找出最优解 ...
- [poj] 2749 building roads
原题 2-SAT+二分答案! 最小的最大值,这肯定是二分答案.而我们要2-SATcheck是否在该情况下有可行解. 对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来 ...
- POJ 2749 Building roads 2-sat+二分答案
把爱恨和最大距离视为限制条件,可以知道,最大距离和限制条件多少具有单调性 所以可以二分最大距离,加边+check #include<cstdio> #include<algorith ...
- POJ 2749 2SAT判定+二分
题意:图上n个点,使每个点都与俩个中转点的其中一个相连(二选一,典型2-sat),并使任意两点最大 距离最小(最大最小,2分答案),有些点相互hata,不能选同一个中转点,有些点相互LOVE,必需选相 ...
- TTTTTTTTTTT POJ 2749 修牛棚 2-Sat + 路径限制 变形
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7019 Accepted: 2387 De ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
随机推荐
- ios开发笔记
@IBDesignable 可在第二视图中实时预览 @IBInspectable 可编辑属性
- Express实现http和https服务
一.介绍Http与Https 概念 HTTP: 超文本传输协议(Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文 ...
- 反射 reflect 初始学习
类也是对象,本身是java.lang.Class 类的对象. Class的三种表示方式: 1.Class a = A.class: 类名.class的方式.经常在日志记录里面,获取当前类的日志记录生成 ...
- linux调整分区大小
查看一下当前分区情况 1 2 3 4 5 6 7 8 [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mou ...
- Android HttpClient GET或者POST请求基本使用方法(转)
在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.这里只介绍如何使用HttpCl ...
- 8 C#中的字符串输出
我们在前面已经用Console.WriteLine("*********")往dos窗口中输出过字符串.我们还定义过字符串的变量. string words ="我喜欢D ...
- 35.在PCB中删除元件
在PCB Editor里面,如果想进行什么操作,首先得点击这个命令,再点击你要操作的区域/元件,最后右键选择"Done",这样你才能完成一个操作.
- pb对Web Service的操作可使用两种方式实现
从PB8.0/9.0开始,就已经提供Web Service Proxy功能,能够直接进行相关程序的编写. 但是,部分老项目使用PB6.5开发 研究后发现,其实PB6.5要操作Web Service也挺 ...
- JavaScript显示输出
记得c语言里的printf和java里的println吗,那么在JavaScript中怎么实现同样的功能呢 window.onload = function() { var para = docume ...
- 在Eclipse中制作SSH配置文件提示插件
原文地址:http://blog.csdn.net/longyuhome/article/details/8968093 这篇博客算是对原先的“在Eclipse中制作和使用struts2配置文件提示插 ...