题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245

题意:给一个已知直径的圆形岛,然后岛的附近是湖,湖里有一些点,以坐标的形式给出,最外层是矩形的终点。

给定跳跃的距离d,让你判断是否能跳到最外层,如果能就输出最短距离以及这个最短跳的步数。

题解:

这题重点在建图,在松弛操作那里也要修改一下。详细看代码。

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
#include<functional>
#define cl(a,b) memset(a,b,sizeof(a));
#define FFC(i,a,b) for(int i=a;i<=b;i++)
#define FFI(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define LL long long
using namespace std;
void fre(){freopen("c:\\acm\\input.txt","r",stdin);}
const double INF=1e9,eps=1e-;
const int MAXN=,MAXM=;
typedef pair<double,int>P;
priority_queue<P,vector<P>,greater<P> >Q;
int v[MAXM],g[MAXN],nxt[MAXM],ed,i,x,N,pre[MAXN];
double w[MAXM],d[MAXN];
int n,xx,yy,cnt,K;
void init(int n){for(i=,ed=,N=n;i<=n;i++)g[i]=;}
void adg(int x,int y,double z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;}
void dijkstra(int S){
for(i=;i<=N;i++)d[i]=INF,pre[i]=S;Q.push(P(d[S]=,S));
while(!Q.empty()){
P t=Q.top();Q.pop();
if(t.first>d[x=t.second])continue;
for(i=g[x];i;i=nxt[i])if(d[x]+w[i]<d[v[i]]&&!(w[i]>K)){//距离必须小于K才能跳
pre[v[i]]=x;//记录路径
Q.push(P(d[v[i]]=d[x]+w[i],v[i]));
}
}
}
struct dt{
int x,y;
}a[];
int abs(int a){return a<eps?-a:a;}
double getdis(int a,int b,int c,int d){return sqrt(1.0*(a-c)*(a-c)+(b-d)*(b-d));}
void build_g(){
//以1为起点
FFC(i,,cnt){
double tmp=getdis(,,a[i].x,a[i].y);
if(tmp<=7.5){adg(,i,);adg(i,,);}
else if(tmp-7.5-K<=eps&&tmp-7.5>eps){adg(,i,tmp-7.5);adg(i,,tmp-7.5);}
}
FFC(i,,cnt)FFC(j,i,cnt){
if(i==j){adg(i,j,);adg(j,i,);}
else{
double tmp=getdis(a[i].x,a[i].y,a[j].x,a[j].y);
adg(i,j,tmp);
adg(j,i,tmp);
}
}
//cnt+1为终点
FFC(i,,cnt){
int min=(-abs(a[i].x))>(-abs(a[i].y))?(-abs(a[i].y)):(-abs(a[i].x));
adg(cnt+,i,(double)min);
adg(i,cnt+,(double)min);
}
}
int getlong(){
int an=,i=cnt+;
while(pre[i]!=i){
i=pre[i],an++;
}
return an;
}
int main(){
//fre();
while(~scanf("%d%d",&n,&K)){
cnt=;
FFC(i,,n){
scanf("%d%d",&xx,&yy);
if(xx<&&yy<)a[++cnt].x=xx,a[cnt].y=yy;
}
//特判,如果K大于42.5可一步跳到岸边
if(K>=42.5){printf("42.50 1\n");continue;}
init(cnt+);
build_g();//建图
dijkstra();
double ans=d[cnt+];
if(ans<INF)printf("%.2lf %d\n",ans,getlong());
else printf("can't be saved\n");
}
return ;
}

HDU_1245_Saving James Bond_最短路的更多相关文章

  1. hdu 1245 Saving James Bond 策画几何+最短路 最短路求步数最少的路径

    #include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #defi ...

  2. 【转】最短路&差分约束题集

    转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...

  3. PTA 07-图5 Saving James Bond - Hard Version (30分)

    07-图5 Saving James Bond - Hard Version   (30分) This time let us consider the situation in the movie ...

  4. Saving James Bond(dijk)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 Saving James Bond Time Limit: 6000/3000 MS (Java ...

  5. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. HDU 4568 Hunter 最短路+TSP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others)Me ...

  7. Dij二级最短路

    hdu1245 Saving James Bond Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  8. java入门---运算符&逻辑运算符&短路逻辑运算符&赋值运算符&条件运算符&instanceof 运算符

        这篇文章接着上次的来,主要看逻辑运算符&短路逻辑运算符&赋值运算符&条件运算符&instanceof 运算符这五种运算符.     首先来看逻辑运算符.下表列出 ...

  9. 洛谷P2243 电路维修 [最短路]

    题目传送门 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...

随机推荐

  1. 移动开发meta集合【精】

    以下是开发中经常用到的meta标签 1.移动webAPP的Meta 用法: <meta content="width=device-width, initial-scale=1.0, ...

  2. ios_swift开发资源整理

    目录 1.苹果官方资源 2.国内外视频网站推荐 3.中文文档 4.demo网站 5.开发工具推荐 6.国内外开发网站论坛 7.技术博客推荐 8.书籍推荐 9.第三方框架推荐 10.第三方发布平台 11 ...

  3. Hololens文件读写

    unity 内勾选 RemovableStorage 选项或 Package.appxmanifest 勾选 可移动存储 选项 uwp app IO操作用 StreamReader 会提示没有权限,如 ...

  4. 用SecureCRT连接虚拟机

    1.Root用户进入虚拟机系统 2.打开控制台 3.永久关闭防火墙,打开sshd,这样SecureCRT才能连接 chkconfig iptables off;service sshd start 4 ...

  5. java模拟数据库缓存

    实现缓存一些数据到本地,避免重复查询数据库,对数据库造成压力,代码如下: package threadLock; import java.util.HashMap; import java.util. ...

  6. Dom编程(一)

    dom:document object model 文档对象模型 1.事件 body 事件:onload onunload onbeforeunload body.document对象的事件 (1)o ...

  7. PIE 阻断回溯——Cut

    PIE(Prolog Inference Engine)通常是搜索所有的解.举个例子, 当然dialog窗口中一开始调用 run. 只会显示一个解(虽然事实上会得到两个解),在前面加上 X=1,就可以 ...

  8. UserDefault数据读取

    //GameScene.h #include "cocos2d.h" USING_NS_CC; class GameScene : public cocos2d::Layer{pu ...

  9. linode更换Linux内核教程(独家)

    Linode服务器性价比高,最低套餐2G内存,享受每月2TB流量,机房40Gb带宽,每月供需10美元(Linode优惠链接).Linode用户创建vps服务器后,可在后台自定义Linux系统版本,包括 ...

  10. nginx的https环境如何配置

    http://www.cnblogs.com/yanghuahui/archive/2012/06/25/2561568.html http://www.fzb.me/2015-1-15-openss ...