HDU 1815 Building roads
二分答案 + 2-SAT验证
POJ 稳过,HDU C++ 超时,G++ 550ms左右AC
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std; const int maxn=+;
int N,A,B;
int left,right,mid;
int s1x,s1y,s2x,s2y;
struct point
{
int x,y;
int p_s1;
int p_s2;
}p[maxn];
int Hx[maxn],Hy[maxn];
int Lx[maxn],Ly[maxn]; stack<int>S;
vector<int>G[maxn];
vector<int>FG[maxn];
int Belong[maxn];
int flag[maxn];
int Block; int dis1,dis2,dis3; void init()
{
for(int i=;i<maxn;i++) G[i].clear();
for(int i=;i<maxn;i++) FG[i].clear();
memset(Belong,,sizeof Belong);
memset(flag,,sizeof flag);
while(!S.empty()) S.pop();
Block=;
} void addEgde(int x,int y)
{
G[x].push_back(y);
FG[y].push_back(x);
} int Dis(int x1,int y1,int x2,int y2)
{
return abs(x1-x2)+abs(y1-y2);
} void read()
{
scanf("%d%d%d%d",&s1x,&s1y,&s2x,&s2y);
for(int i=;i<N;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(int i=;i<=A;i++)
{
scanf("%d%d",&Hx[i],&Hy[i]);
Hx[i]--;Hy[i]--;
}
for(int i=;i<=B;i++)
{
scanf("%d%d",&Lx[i],&Ly[i]);
Lx[i]--;Ly[i]--;
}
} void dfs1(int now)
{
flag[now]=;
for(int i=;i<G[now].size();i++)
if(!flag[G[now][i]])
dfs1(G[now][i]);
S.push(now);
} void dfs2(int now)
{
Belong[now]=Block;
for(int i=;i<FG[now].size();i++)
if(!Belong[FG[now][i]])
dfs2(FG[now][i]);
} bool judge()
{
for(int i=;i<*N;i++) if(!flag[i]) dfs1(i);
while(!S.empty())
{
int Top=S.top(); S.pop();
if(!Belong[Top])
{
Block++;
dfs2(Top);
}
}
for(int i=;i<N;i++)
if(Belong[*i]==Belong[*i+])
return ;
return ;
} void solve()
{
left=;right=;
int ans=-;
while(left<=right)
{
mid=(left+right)/;
init(); for(int i=;i<N;i++){
for(int j=i+;j<N;j++)
{
int pi_s1=p[i].p_s1;
int pi_s2=p[i].p_s2;
int pj_s1=p[j].p_s1;
int pj_s2=p[j].p_s2;
int s1_s2=Dis(s1x,s1y,s2x,s2y); if(pi_s1+pj_s1>mid) {
addEgde(*i,*j+);
addEgde(*j,*i+);
} if(pi_s2+pj_s2>mid) {
addEgde(*i+,*j);
addEgde(*j+,*i);
} if(pi_s1+s1_s2+pj_s2>mid) {
addEgde(*i,*j);
addEgde(*j+,*i+);
} if(pi_s2+s1_s2+pj_s1>mid) {
addEgde(*i+,*j+);
addEgde(*j,*i);
}
} } for(int i=;i<=A;i++)
{
addEgde(*Hx[i],*Hy[i]+);
addEgde(*Hy[i]+,*Hx[i]);
addEgde(*Hx[i]+,*Hy[i]);
addEgde(*Hy[i],*Hx[i]+);
}
for(int i=;i<=B;i++)
{
addEgde(*Lx[i],*Ly[i]);
addEgde(*Ly[i],*Lx[i]);
addEgde(*Lx[i]+,*Ly[i]+);
addEgde(*Ly[i]+,*Lx[i]+);
}
if(judge()) ans=mid,right=mid-;
else left=mid+;
}
printf("%d\n",ans);
}
int main()
{
while(~scanf("%d%d%d",&N,&A,&B))
{
read();
for(int i=;i<N;i++)
{
p[i].p_s1=Dis(p[i].x,p[i].y,s1x,s1y);
p[i].p_s2=Dis(p[i].x,p[i].y,s2x,s2y);
}
solve();
}
return ;
}
HDU 1815 Building roads的更多相关文章
- HDU 3721 Building Roads (2010 Asia Tianjin Regional Contest) - from lanshui_Yang
感慨一下,区域赛的题目果然很费脑啊!!不过确实是一道不可多得的好题目!! 题目大意:给你一棵有n个节点的树,让你移动树中一条边的位置,即将这条边连接到任意两个顶点(边的大小不变),要求使得到的新树的直 ...
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...
- 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 1102 Constructing Roads, Prim+优先队列
题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...
- HDU 5033 Building(单调栈)
HDU 5033 Building(单调栈) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5033 Description Once upon a ti ...
- Building roads
Building roads Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU—— 5159 Building Blocks
Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build blocks. LeL ...
随机推荐
- Centos sudo添加用户
$ su - # vi /etc/sudoers 在root ALL=(ALL) ALL下 添加 username ALL=(ALL) ALL 输入wq!强制保存.
- LeetCode OJ 27. Remove Element
Given an array and a value, remove all instances of that value in place and return the new length. D ...
- Mysql 锁机制
innodb引擎提供了针对表级锁和行级锁 这个文章说的是行级锁 Lock有两种类型: 1,s-lock(共享锁),拥有该锁的transaction可以对row进行read操作 2,x-lock(排它锁 ...
- Hibernate关于openSession和getCurrentSession的理解
来源(转载):http://blog.csdn.net/woshisap/article/details/7024482 1:getCurrentSession会把Session和当前的线程关联起来, ...
- Linq List<String>
List<string> _year = new List<string>() { "一月", "二月", "三月" ...
- json的引号之伤
最近读他们的jquery解读的源码,由于版本不同,我可能看的是他们解读的1.7的,但是我本身运行的可能是1.9的,所以有些出处,但是中心思想不变,我有疑问的时候,直接debug,让例子自己走一遍,好处 ...
- linux sigaction信号处理
sigaction函数相比signal函数更为复杂,但更具灵活性,下面具体介绍她的结构和用法: #include <signal.h> int sigaction(int signum, ...
- C# 垃圾回收机制(转)
摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助. GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由 ...
- String.Format(string, arg0)中sring格式
复合格式字符串和对象列表将用作支持复合格式设置功能的方法的参数.复合格式字符串由零个或多个固定文本段与一个或多个格式项混和组成.固定文本是所选择的任何字符串,并且每个格式项对应于列表中的一个对象或装箱 ...
- RING0,RING1,RING2,RING3
Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3.Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用.如果普 ...