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 ...
随机推荐
- 定时执行.SH
crontab -l 看自定义定时列表 crontab -e 编辑 */10 * * * * /bak/bak.sh10分钟执行一次 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- flash检测网络是否通畅
air: 要在 Adobe ® Flash ® Professional(CS4 或更高版本)中使用 air.net 包: 选择“文件”>“发布设置”命令. 在 Flash 面板中,单击 Act ...
- 中国内地、台湾、香港、澳门和国外DNS服务器地址列表
中国内地.台湾.香港.澳门和国外DNS服务器地址列表 详细内容 作者:网路岗 来源:局域网监控软件 DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成 ...
- 安卓获取线程id
错误的做法: @Override public void onCreate() { mContext = getApplicationContext(); mHandler = new Handler ...
- js打印保存用户输入的内容
在用js打印局部页面时,遇到用户新输入的内容没能打印出来,经过观察,发现我采用的js打印方法是读取页面源代码,而用户输入的内容如果不将其写入到页面源代码中去,是打印不出来的,下面是我的解决方法: // ...
- Windows下动态库的编译以及调用
1.MFC下生成动态库 1>显式调用 在.cpp文件里添加接口函数 int sum(int a,int b) { return a + b; } int sub(int a,int b) { r ...
- ActiveX控件打包成Cab实现浏览器自动下载安装
前言 我们在浏览器中使用我们自己的一些OCX,或者是DLL这一类的文件,在X86的机器上需要我们手动将这些文件拷贝到Windows/System32 文件夹下面去,然后通过Dos命令regsvr32 ...
- js-call、apply
这里主要就是做一些前人的总结,有时候会有自己的看法,首先把定义说一下 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义 ...
- u盘烧写后实际容量变小了
百度了一下 : http://jingyan.baidu.com/article/d45ad148f383ea69552b808a.html 百度下载 USBoot 打开软件 列表中选择你的U盘,点击 ...
- MyBatis中Like语句使用方式
oracle数据库: SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或 SELECT * FROM user WHERE nam ...