HDU_1245_Saving James Bond_最短路
题目连接: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_最短路的更多相关文章
- hdu 1245 Saving James Bond 策画几何+最短路 最短路求步数最少的路径
#include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #defi ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- 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 ...
- Saving James Bond(dijk)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 Saving James Bond Time Limit: 6000/3000 MS (Java ...
- hdu 4568 Hunter 最短路+dp
Hunter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 4568 Hunter 最短路+TSP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others)Me ...
- Dij二级最短路
hdu1245 Saving James Bond Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- java入门---运算符&逻辑运算符&短路逻辑运算符&赋值运算符&条件运算符&instanceof 运算符
这篇文章接着上次的来,主要看逻辑运算符&短路逻辑运算符&赋值运算符&条件运算符&instanceof 运算符这五种运算符. 首先来看逻辑运算符.下表列出 ...
- 洛谷P2243 电路维修 [最短路]
题目传送门 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
随机推荐
- Logstash使用grok过滤nginx日志(二)
在生产环境中,nginx日志格式往往使用的是自定义的格式,我们需要把logstash中的message结构化后再存储,方便kibana的搜索和统计,因此需要对message进行解析. 本文采用grok ...
- Java learning notes (1):Basic Knowlege points
Basic Knowlege points: 1: it's necessary that there is only one public class in per .java file 2: .j ...
- Windows 服务 Error 14001
如果碰到 windows 服务安装不了或者启动不了,报14001的配置文件错误,那么 可以从.exe.config入手,我这次遇到的是配置中有中文注释导致的. 我把空行以及中文的注释去掉以后,整个世界 ...
- wpf 线程与界面线程
Thread thread = new Thread(new ThreadStart(() => { VisualTarget visualTarget = ...
- mybatis分页控件
https://my.oschina.net/miemiedev/blog/135516
- Firefox一次提交两次请求的问题
把这迅雷的插件禁用后一切恢复正常.
- SQL 默认数据库被误删
我今天也遇到了,自己解决了.这是我总结的:(不管这帖子沉到哪里了) 删除了SQL服务器默认数据库,无法连接服务器,用户[]登录失败. 1,使用管理员账户修改此用户的默认数据库. 企业管理器,展开 ...
- Python_Selenium2Library源码分析
I. Introduction Selenium2Library是robot framework中主流的测试网页功能的库, 它的本质是对webdriver的二次封装, 以适应robot框架. 百度上一 ...
- 解决ie 低版本的 background-size 兼容问题
在IE不支持这个属性的时候可以通过滤镜来实现这样的一个效果. div{background-size: cover;filter:progid:DXImageTransform.Microsoft.A ...
- 在一个form里边同时执行搜索和 execl导出功能
一个form 分搜索 和 导出<form name="searchform" id="searchform" > <input type=&q ...