题目连接: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. Python学习懒出极致——自备常用链接

    linux: samba配置:http://blog.chinaunix.net/uid-23069658-id-3142052.html ubuntu: mysql启停:http://www.2ct ...

  2. C#深复制与浅复制

    C#深复制与浅复制 C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于值类型数据,复制的时候直接将数据 ...

  3. Erlang虚拟机的启动

    Erlang虚拟机的启动 erl实际上是一个shell脚本,设置几个环境变量之后,调用执行erlexec.erlexec的入口点在 otp_src_R15B01/erts/etc/common/erl ...

  4. 项目中处理android 6.0权限管理问题

    android 6.0对于权限管理比较收紧,因此在适配android 6.0的时候就很有必要考虑一些权限管理的问题. 如果你没适配6.0的设备并且权限没给的话,就会出现类似如下的问题: java.la ...

  5. Facebook FB.init() status参数的作用

    意思是 status 设为 ture 之后调用 FB.getLoginStatus() 不再产生网络请求,数据已经在 FB.init() 调用的时候被请求回来,缓存住了.

  6. 启动Mysql报错:Another MySQL daemon already running with the same unix socket.

    启动Mysql报错: Another MySQL daemon already running with the same unix socket. 删除如下文件即可解决 /var/lib/mysql ...

  7. AppDelegate 里一个基本的跳转方法,用来在rootView崩溃的时候直接调试我自己的页面

    将 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)lau ...

  8. 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误

    修改Web.config,增加requestValidationMode="2.0"属性值 <system.web> <httpRuntime requestVa ...

  9. Python爬虫----Beautiful Soup4 基础

    1. Beautiful Soup简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyth ...

  10. poi做Excel数据驱动,支持.xls和.xlsx格式的excel文档,比起jxl强大不少

    import java.io.FileInputStream;import java.io.InputStream;import java.util.Iterator;import java.util ...