POJ2749:Building roads——题解
http://poj.org/problem?id=2749
(这个约翰的奶牛真多事…………………………)
i表示u与s1连,i+n表示u与s2连。
老规矩,u到v表示取u必须取v。
那么对于互相打架的奶牛u,v,有:
add(u,v+n);add(v,u+n);
add(u+n,v);add(v+n,u);
对于互为朋友的奶牛u,v,有:
add(u,v);add(v,u);
add(u+n,v+n);add(v+n,u+n);
但这远远不够,我们需要求最大值最小……
二分?但是我们怎么边处理矛盾边的距离?
那么我们也想把连边处理成冲突。
对于奶牛i,j,sxy表示i到x到y到j的距离,mid是我们二分的最大值最小。
那么显然,对于s>mid,那么一定是矛盾的,此时明显我们要采取相反的方法。
因为我们i和j的循环方式都是1-n,所以我们使i不变,把j变一下即可。
用代码表示就是:
if(s11>mid)add(i,j+n);
if(s12>mid)add(i,j);
if(s21>mid)add(i+n,j+n);
if(s22>mid)add(i+n,j);
(然而我还是查了题解的……我真菜)
#include<stack>
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
inline int read(){
int x=,w=;char ch=;
while(ch<''||ch>''){if(ch=='-')w=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*w;
}
const int N=;
const int M=;
struct cow{
int x;
int y;
}e[N],s[];
struct node{
int to;
int nxt;
}edge[M];
struct wzh{
int u;
int v;
}aa[],bb[];
int head[N*],dfn[N*],low[N*],to[N*];
int t,l,cnt;
bool instack[N*];
stack<int>q;
inline void add(int u,int v){
cnt++;
edge[cnt].to=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
return;
}
void tarjan(int u){
t++;
dfn[u]=t;
low[u]=t;
q.push(u);
instack[u]=;
for(int i=head[u];i!=;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(instack[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
int v;
l++;
do{
v=q.top();
q.pop();
instack[v]=;
to[v]=l;
}while(v!=u);
}
return;
}
inline int dis(int a,int k1,int k2,int b){
return
abs(s[k1].x-e[a].x)+abs(s[k1].y-e[a].y)+
abs(s[k1].x-s[k2].x)+abs(s[k1].y-s[k2].y)+
abs(s[k2].x-e[b].x)+abs(s[k2].y-e[b].y);
}
inline void clr(){
cnt=;l=;t=;
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
return;
}
int n,ans=-;
int a,b;
void erfen(int l,int r){
if(l>r)return;
clr();
int mid=(l+r)>>;
for(int i=;i<=a;i++){
int u=aa[i].u;int v=aa[i].v;
add(u,v+n);add(v,u+n);
add(u+n,v);add(v+n,u);
}
for(int i=;i<=b;i++){
int u=bb[i].u;int v=bb[i].v;
add(u,v);add(v,u);
add(u+n,v+n);add(v+n,u+n);
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j)continue;
int s11=dis(i,,,j),s12=dis(i,,,j),
s21=dis(i,,,j),s22=dis(i,,,j);
if(s11>mid)add(i,j+n);
if(s12>mid)add(i,j);
if(s21>mid)add(i+n,j+n);
if(s22>mid)add(i+n,j);
}
}
for(int i=;i<=n*;i++){
if(!dfn[i])tarjan(i);
}
for(int i=;i<=n;i++){
if(to[i]==to[i+n]){
erfen(mid+,r);
return;
}
}
ans=mid;
erfen(l,mid-);
return;
}
//i表示与s1连,i+n表示与s2连
int main(){
n=read();a=read();b=read();
s[].x=read();s[].y=read();s[].x=read();s[].y=read();
for(int i=;i<=n;i++){
e[i].x=read();
e[i].y=read();
}
for(int i=;i<=a;i++){
aa[i].u=read();
aa[i].v=read();
}
for(int i=;i<=b;i++){
bb[i].u=read();
bb[i].v=read();
}
erfen(,);
printf("%d\n",ans);
return ;
}
POJ2749:Building roads——题解的更多相关文章
- [POJ2749]Building roads(2-SAT)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8153 Accepted: 2772 De ...
- 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- 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 ...
- POJ2749 Building roads
嘟嘟嘟 最近把21天漏的给不上. 今天重温了一下2-SAT,感觉很简单.就是把所有条件都转化成如果--必然能导出--.然后就这样连边建图,这样一个强连通分量中的所有点必然都是真或者假.从而根据这个点拆 ...
- USACO Building Roads
洛谷 P2872 [USACO07DEC]道路建设Building Roads 洛谷传送门 JDOJ 2546: USACO 2007 Dec Silver 2.Building Roads JDOJ ...
- poj 3625 Building Roads
题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...
- poj 2749 Building roads (二分+拆点+2-sat)
Building roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6229 Accepted: 2093 De ...
- BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )
计算距离时平方爆了int结果就WA了一次...... ------------------------------------------------------------------------- ...
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...
随机推荐
- 一个例子说明substr(), mb_substr() 和 mb_strcut()之间的区别
例子来自PHP官方文档,我只是翻译下. http://www.php.net/manual/zh/function.mb-strcut.php header( 'Content-Type:text/h ...
- Unity Android设备的输入
Unity Android设备的输入 1依据屏幕位置输入 有的时候也许是为了整个有些风格的干净,减少屏幕上的UI图标,以至于摒弃了虚拟按键这种常用的输入方式.为了替代虚拟按键的输入方式而选择了依据点击 ...
- 前端开发工程师 - 06.Mini项目实战 - 项目简介
第6章--Mini项目实战 项目简介 Mini项目简介-Ego社区开发 回顾: 页面制作 页面架构 JavaScript程序设计 DOM编程艺术 产品前端架构 实践课Mini项目--Ego: 主题:漫 ...
- JAVA基础学习之路(八)[1]String类的基本特点
String类的两种定义方式: 直接赋值 通过构造方法赋值 //直接赋值 public class test2 { public static void main(String args[]) { S ...
- 深入理解eos账户体系 active和action
在eos中,账户是一个非常重要的概念. 账户分为两部分组成 一种是active 一种是action. 智能合约本质上来讲就是一个action加上一个回馈脚本程序.任何智能合约都有这俩个部分组成. 那么 ...
- 将SqlDataReader 数据集转化为datatbale ,在将datatable 转化为iList
public IList GetModelList(string tablename, string where) { IList list = null; DataTable dataTable = ...
- 官方文档 恢复备份指南二 Getting Started with RMAN
本章对RMAN进行基本的熟悉和了解 1.Overview of the RMAN Environment RMAN运行时需要的最小环境: target database ...
- HDU 3007 Buried memory(计算几何の最小圆覆盖,模版题)
Problem Description Each person had do something foolish along with his or her growth.But,when he or ...
- tabales1.10版参数详解
//@translator codepiano //@blog codepiano //@email codepiano.li@gmail.com //尝试着翻译了一下,难免有错误的地方,欢迎发邮件告 ...
- java—连连看GUI
1.连连看棋盘图形化 package Link; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impo ...