思路题


  我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解【走的方向任意】这句话……

  其实就是说想咋走咋走= =360°无死角乱走……

  所以其实是个平面上的问题……

  我们可以换个方向来考虑……二分一个答案,判断英雄走到/走不到公主那里,是不是就等价于,boss控制的区域连起来了使得英雄走不到公主那里了?(狼抓兔子的即视感)

  所以我们可以转化成从上边&左边,在boss之间走,使得走到下边&右边 路径上最大的一条边(边权代表着如果英雄从这两个boss之间经过,离两个boss最近的距离(所以就是$\frac{dis(boss[i],boss[j])}{2}$))最小。

  这个好像不能SPFA?(明明是你蒻)……我WA40了……只能bellman-ford迭代了……

 /**************************************************************
Problem: 3007
User: Tunix
Language: C++
Result: Accepted
Time:1176 ms
Memory:72104 kb
****************************************************************/ //Huce #3 A
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*sign;
}
typedef long long LL;
const int N=,INF=~0u>>;
const double eps=1e-;
/*******************tamplate********************/
struct Boss{
int x,y;
Boss(){}
Boss(int x,int y):x(x),y(y){}
void read(){scanf("%d%d",&x,&y);}
}boss[N];
double inf = << ,g[N][N],f[N];
int n,row,line;
double dis(Boss a,Boss b){
double x,y;
x=a.x-b.x; y=a.y-b.y;
return sqrt(x*x+y*y);
}
void build(){
F(i,,n+) F(j,,n+) g[i][j]=inf;
F(i,,n) F(j,i+,n)
g[i][j]=g[j][i]=dis(boss[i],boss[j])/;
F(i,,n){
g[n+][i]=boss[i].y-;
g[n+][i]=row-boss[i].x;
g[i][n+]=line-boss[i].y;
g[i][n+]=boss[i].x-;
}
} bool vis[N];
double solve(){
memset(vis,,sizeof vis);
F(i,,n+) f[i]=inf;
f[n+]=f[n+]=;
vis[n+]=vis[n+]=;
double mn; int l;
while(){
mn=inf; l=-;
F(i,,n+) if (vis[i] && f[i]<mn){
mn=f[i]; l=i;
}
if (l==-) break;
F(i,,n+)
if (max(g[l][i],f[l])<f[i]){
f[i]=max(g[l][i],f[l]);
vis[i]=;
}
vis[l]=;
}
return min(f[n+],f[n+]);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
n=getint(); row=getint(); line=getint();
F(i,,n) boss[i].read();
double ans=inf;
F(i,,n){
ans=min(ans,dis(Boss(,),boss[i]));
ans=min(ans,dis(Boss(row,line),boss[i]));
//用起始位置和结束位置更新答案
}
build();
ans=min(ans,solve());
printf("%.2lf\n",ans);
return ;
}

UPD:果然是我spfa的姿势不对,终于A了,但是比迭代还要慢……我写的spfa就是shit QAQ

ZYF:因为是邻接矩阵(完全图),边都是满的……

 /**************************************************************
Problem: 3007
User: Tunix
Language: C++
Result: Accepted
Time:2172 ms
Memory:72116 kb
****************************************************************/ //Huce #3 A
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*sign;
}
typedef long long LL;
const int N=,INF=~0u>>;
const double eps=1e-;
/*******************tamplate********************/
struct Boss{
int x,y;
Boss(){}
Boss(int x,int y):x(x),y(y){}
void read(){scanf("%d%d",&x,&y);}
}boss[N];
double inf = << ,g[N][N],f[N];
int n,row,line;
double dis(Boss a,Boss b){
double x,y;
x=a.x-b.x; y=a.y-b.y;
return sqrt(x*x+y*y);
}
void build(){
F(i,,n+) F(j,,n+) g[i][j]=inf;
F(i,,n) F(j,i+,n)
g[i][j]=g[j][i]=dis(boss[i],boss[j])/;
F(i,,n){
g[n+][i]=boss[i].y-;
g[n+][i]=row-boss[i].x;
g[i][n+]=line-boss[i].y;
g[i][n+]=boss[i].x-;
}
}
int Q[N];
bool inq[N];
double solve(){
F(i,,n+) f[i]=INF;
f[n+]=f[n+]=;
int l=,r=;
Q[r++]=n+; inq[n+]=;
Q[r++]=n+; inq[n+]=;
while(l!=r){
int x=Q[l]; inq[x]=;
l=(l+)%N;
inq[x]=;
F(i,,n+)
if (max(g[x][i],f[x])<f[i]){
f[i]=max(g[x][i],f[x]);
if (!inq[i]){
Q[r]=i;
r=(r+)%N;
inq[i]=;
}
}
}
return min(f[n+],f[n+]);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
n=getint(); row=getint(); line=getint();
F(i,,n) boss[i].read();
double ans=1e20;
F(i,,n){
ans=min(ans,dis(Boss(,),boss[i]));
ans=min(ans,dis(Boss(row,line),boss[i]));
//ÓÃÆðʼλÖúͽáÊøλÖøüдð°¸
}
build();
ans=min(ans,solve());
printf("%.2lf\n",ans);
return ;
}

3007: 拯救小云公主

Time Limit: 5 Sec  Memory Limit: 512 MB
Submit: 71  Solved: 36
[Submit][Status][Discuss]

Description

    英雄又即将踏上拯救公主的道路……
    这次的拯救目标是——爱和正义的小云公主。
    英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss。当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务。
    但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻。
    Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line)。英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离boss的最短距离最远。
Ps:英雄走的方向是任意的。
    你可以帮帮他吗?
    当英雄找到了美丽漂亮的小云公主,立刻就被boss包围了!!!英雄缓闭双眼,举手轻挥,白光一闪后使用了回城卷轴,回到了城堡,但只有小云公主回去了……因为英雄忘了进入回城的法阵了。
 

Input

    第一行,输入三个整数,n表示boss的数目,row,line表示矩形的大小;
    接下来n行,每行分别两个整数表示boss的位置坐标。
 

Output

    输出一个小数,表示英雄的路径离boss的最远距离,精确到小数点后两位。
 

Sample Input

1 3 3
2 2

输出样例1:
1.00

输入样例2:
1 3 3
3 1

输出样例2:
2.00

Sample Output

 

HINT

100%数据,n<=3000;

Source

[Submit][Status][Discuss]

【BZOJ】【3007】拯救小云公主的更多相关文章

  1. BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主

    4219: 跑得比谁都快 3007: 拯救小云公主 三角剖分的解释可以看这里:http://www.cnblogs.com/Enceladus/p/6706444.html 后一道是前一道的弱化版. ...

  2. BZOJ 3007 解救小云公主 二分答案+对偶图

    题目大意:给定一个矩形和矩形内的一些点.求一条左下角到右上角的路径.使全部点到这条路径的最小距离最大 最小距离最大.果断二分答案 如今问题转化成了给定矩形中的一些圆形障碍物求左下角和右上角是否连通 然 ...

  3. 洛谷 P2498 [SDOI2012]拯救小云公主 解题报告

    P2498 [SDOI2012]拯救小云公主 题目描述 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到\(boss\)的洞穴门口,他一下子就懵了,因为面前不只是一 ...

  4. 【BZOJ3007】拯救小云公主 二分+几何+对偶图

    [BZOJ3007]拯救小云公主 Description     英雄又即将踏上拯救公主的道路……     这次的拯救目标是——爱和正义的小云公主.     英雄来到boss的洞穴门口,他一下子就懵了 ...

  5. bzoj3007: 拯救小云公主

    Description     英雄又即将踏上拯救公主的道路……     这次的拯救目标是——爱和正义的小云公主.     英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是 ...

  6. 二分+并查集【bzoj3007】[SDOI2012]拯救小云公主

    Description 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意 ...

  7. P2498 [SDOI2012]拯救小云公主

    \(\color{#0066ff}{ 题目描述 }\) 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只bos ...

  8. 【bzoj3007】拯救小云公主 二分+对偶图+并查集

    题目描述 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等 ...

  9. 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】

    题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...

随机推荐

  1. php 实现多线程

    通过php的Socket方式实现php程序的多线程.php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的.每一个访问者,当访问WEB页面的时候,都将 ...

  2. Thinkphp 获取当前url

    $_GET['_URL_'] 获取整个url,返回值是数组 $Think.MODULE_NAME 获取当前class的名称 $Think.ACTION_NAME 获取当前action的方法名称

  3. ajax+php+mysql更新

    html代码 <input type="button" id="quxiao" class="quxiao" name="q ...

  4. How to using T-SQL statement copy table[SQL]

    SQL复制表的几种方法:  仅复制表结构:select * into newTableName from OldTableName where 1 = 2 SQL复制整张表 select * into ...

  5. python xml包使用记录

    <?xml version="1.0" encoding="utf-8" ?> <request> <functionID> ...

  6. 关于EF分页查询报错(Count must have a non-negative value.)的解决方案

    具体的异常信息如下,一开始没有写日志只看到错误信息:Count must have a non-negative value.,从表面意思可以看出来是Count值出现了负数,所以报错,查了半天的原因也 ...

  7. Android--Fragment的懒加载

    我们都知道,fragment放在viewPager里面,viewpager会帮我们预先加载一个,但是当我们要看fragment里面的内容时,我们也许只会去看第一个,不会去看第二个,如果这时候不去实现f ...

  8. core java 5~6(OOP & 高级语言特征)

    MODULE 5 OOP 面向对象程序设计--------------------------------------------------------Object Oriented Program ...

  9. 【EF Code First】 一对一、一对多的多重关系配置

    这里使用相册Album和图片Picture的关系做示例 1,Album与Picture最基本的关系是1-n(一个相册可以有多张图片) 这时Album.Picture实体类可以这么定义 /// < ...

  10. 浅谈.NET中闭包

    什么是闭包 闭包可以从而三个维度来说明.在编程语言领域,闭包是指由函数以及与函数相关的上下文环境组合而成的实体.通过闭包,函数与其上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程 ...