hdu1245

Saving James Bond

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 1877    Accepted Submission(s): 356

Problem Description
This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the world's most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with crocodiles. There he
performed the most daring action to escape -- he jumped onto the head of the nearest crocodile! Before the animal realized what was happening, James jumped again onto the next big head... Finally he reached the bank before the last crocodile could bite him
(actually the stunt man was caught by the big mouth and barely escaped with his extra thick boot).

Assume that the lake is a 100×100 square one. Assume that the center of the lake is at (0,0) and the northeast corner at (50,50). The central island is a disk centered at (0,0) with the diameter of 15. A number of crocodiles are in the lake at various positions.
Given the coordinates of each crocodile and the distance that James could jump, you must tell him whether he could escape.If he could,tell him the shortest length he has to jump and the min-steps he has to jump for shortest length.
 
Input
The input consists of several test cases. Each case starts with a line containing n <= 100, the number of crocodiles, and d > 0, the distance that James could jump. Then one line follows for each crocodile, containing the (x, y) location of the crocodile. Note
that x and y are both integers, and no two crocodiles are staying at the same position. 
 
Output
For each test case, if James can escape, output in one line the shortest length he has to jump and the min-steps he has to jump for shortest length. If it is impossible for James to escape that way, simply ouput "can't be saved".
 
Sample Input
4 10
17 0
27 0
37 0
45 0
1 10
20 30
 
Sample Output
42.50 5
can't be saved

题意:

二级最短路算法:

方法一

#include"stdio.h"
#include"string.h"
#include"iostream"
#include"map"
#include"string"
#include"queue"
#include"stdlib.h"
#include"math.h"
#define M 40
#define eps 1e-10
#define inf 99999999
#define mod 1000000000
using namespace std;
struct st
{
int u,v,next;
double w;
}edge[30000];
int head[111],use[111],n,t,time[111];
double dis[111];
struct node
{
double x,y;
}p[111];
double pow(double x)
{
return x*x;
}
double Len(node a,node b)
{
return sqrt(pow(a.x-b.x)+pow(a.y-b.y));
}
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v,double w)
{
edge[t].u=u;
edge[t].v=v;
edge[t].w=w;
edge[t].next=head[u];
head[u]=t++;
}
void bfs(int S)
{
int i;
queue<int>q;
memset(use,0,sizeof(use));
for(i=0;i<=n;i++)
{
time[i]=dis[i]=inf;
}
dis[S]=time[S]=0;
q.push(S);
while(!q.empty())
{
int u=q.front();
q.pop();
use[u]=1;
for(i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(dis[v]>dis[u]+edge[i].w)
{
dis[v]=dis[u]+edge[i].w;
time[v]=time[u]+1;
}
if(fabs(dis[v]-dis[u]-edge[i].w)<eps)
{
if(time[v]>time[u]+1)
time[v]=time[u]+1;
}
if(!use[v])
q.push(v);
}
}
}
int judge(double x,double y)
{
if(x>=-50&&x<=50&&y>=-50&&y<=50&&x*x+y*y>=7.5*7.5)
return 1;
return 0;
}
int main()
{
int m,i,j;
double d;
while(scanf("%d%lf",&m,&d)!=-1)
{
p[0].x=p[0].y=0;
for(i=1;i<=m;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
init();
for(i=1;i<=m;i++)
{
for(j=i+1;j<=m;j++)
{
if(judge(p[i].x,p[i].y)&&judge(p[j].x,p[j].y))
{
double L=Len(p[i],p[j]);
if(L<=d)
{
add(i,j,L);
add(j,i,L);
}
}
}
}
n=m+1;
for(i=1;i<=m;i++)
{
if(judge(p[i].x,p[i].y))
{
double L=Len(p[0],p[i]);
if(L-7.5<=d)
{
add(0,i,L-7.5);
add(i,0,L-7.5);
}
double L1=min(50-p[i].x,50+p[i].x);
double L2=min(50-p[i].y,50+p[i].y);
L=min(L1,L2);
if(L<=d)
{
add(i,n,L);
add(n,i,L);
}
}
}
if(d>=50-7.5)
{
add(0,n,50-7.5);
add(n,0,50-7.5);
}
bfs(0);
if(dis[n]<inf)
printf("%.2lf %d\n",dis[n],time[n]);
else
printf("can't be saved\n");
}
return 0;
}

方法二:dij

#include"stdio.h"
#include"string.h"
#include"math.h"
#define M 111
#define inf 99999999
#define eps 1e-8
#include"iostream"
using namespace std;
struct node
{
double x,y;
}p[M];
int use[M],time[M][M],mint[M],n;
double dis[M],G[M][M];
double pow(double x)
{
return x*x;
}
double Len(node a,node b)
{
return sqrt(pow(a.x-b.x)+pow(a.y-b.y));
}
void dij(int s)
{
int i;
memset(use,0,sizeof(use));
for(i=0;i<=n;i++)
{
dis[i]=G[s][i];
mint[i]=time[s][i];
}
mint[s]=0;
dis[s]=0;
use[s]=1;
int w=n;
while(w--)
{
double min=inf;
int tep=-1;
for(i=0;i<=n;i++)
{
if(!use[i]&&dis[i]<min)
{
min=dis[i];
tep=i;
}
}
if(tep==-1)
return;
use[tep]=1;
for(i=0;i<=n;i++)
{
if(!use[i]&&dis[i]>dis[tep]+G[tep][i])
{
dis[i]=dis[tep]+G[tep][i];
mint[i]=mint[tep]+time[tep][i];
}
else if(!use[i]&&fabs(dis[i]-dis[tep]-G[tep][i])<eps)
{
if(mint[i]>mint[tep]+time[tep][i])
mint[i]=mint[tep]+time[tep][i];
}
}
}
}
int ok(double x,double y)
{
if(x>=-50&&y>=-50&&x<=50&&y<=50&&x*x+y*y>=7.5*7.5)
return 1;
return 0;
}
int main()
{
int m,i,j;
double d;
while(scanf("%d%lf",&m,&d)!=-1)
{
n=m+1;
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
time[i][j]=G[i][j]=inf;
G[i][i]=time[i][i]=0;
}
p[0].x=p[0].y=0;
for(i=1;i<=m;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
if(ok(p[i].x,p[i].y)&&ok(p[j].x,p[j].y))
{
double L=Len(p[i],p[j]);
if(d>=L)
{
G[i][j]=G[j][i]=L;
time[i][j]=time[j][i]=1;
} }
}
}
for(i=1;i<=m;i++)
{
if(ok(p[i].x,p[i].y))
{
double L1=min(50-p[i].x,50+p[i].x);
double L2=min(50-p[i].y,50+p[i].y);
double L=min(L1,L2);
if(d>=L)
{
G[i][n]=G[n][i]=L;
time[i][n]=time[n][i]=1;
} L=Len(p[i],p[0])-7.5;
if(d>=L)
{
G[0][i]=G[i][0]=L;
time[0][i]=time[i][0]=1;
} }
}
if(d>=42.5)
{
G[0][n]=G[n][0]=42.5;
time[0][n]=time[n][0]=1;
} dij(0);
if(dis[n]<inf)
printf("%.2lf %d\n",dis[n],mint[n]);
else
printf("can't be saved\n");
}
return 0;
}

Dij二级最短路的更多相关文章

  1. PAT 1087【二级最短路】

    二级最短路+二级最短路,就是DP过程吧. 代码稍微注释一些,毕竟贴代码不好.. #include<bits/stdc++.h> using namespace std; typedef l ...

  2. 51nod1459【二级最短路】

    标签说的是BFS... 太菜,不知道怎么BFS...是不是spfa写,就叫BFS...感觉不是.... 只是二级最短路的写法,直接搞就很容易了,简单题: #include <bits/stdc+ ...

  3. 链式前向星实现的堆优化dij求最短路模板

    #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...

  4. UVA 10801 Dij最短路(改模板)

    题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间: 思路:Dij求最短路.如果是另一条路比 ...

  5. Codeforces 545E. Paths and Trees 最短路

    E. Paths and Trees time limit per test: 3 seconds memory limit per test: 256 megabytes input: standa ...

  6. vijos 1423 最短路or环(有向图)

    最佳路线 描述 年久失修的赛道令国际汽联十分不满.汽联命令主办方立即对赛道进行调整,否则将取消其主办权.主办方当然必须马上开始行动. 赛道测评人员经过了三天三夜的数据采集,选出了若干可以使用的道路和各 ...

  7. 【BZOJ2622】[2012国家集训队测试]深入虎穴 次短路

    [BZOJ2622][2012国家集训队测试]深入虎穴 Description 虎是中国传统文化中一个独特的意象.我们既会把老虎的形象用到喜庆的节日装饰画上,也可能把它视作一种邪恶的可怕的动物,例如“ ...

  8. Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)

    跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...

  9. DIJ的优化,和spfa的优化

    SPFA和DIJ求最短路的算法的坑点一直是很多的.经常会让人搞不懂. 易错案例: 用重载运算符来排序,如: struct cmp { bool operator ()(int x, int y) co ...

随机推荐

  1. 异常:Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details.

    碰到这个异常我也是挺无语的,因为Android Studio根本不会提示你详细的错误信息. 我们来看看这个博主:http://blog.csdn.net/runner__1/article/detai ...

  2. sparkr基本操作1

    由于装的sparkr是1.4版本的,老版本的很多函数已经不再适用了. 在2台服务器的组成的集群中测试了一版数据,熟悉下这个api的基本操作.​ libpath <- .libPaths() li ...

  3. TCP/IP和Socket的关系

    要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,w ...

  4. ADC相关参数之---分辨率和精度

    ADC的分辨率被定义为输入信号值的最小变化,这个最小数值变化会改变数字输出值的一个数值.对于一个理想ADC来说,传递函数是一个步宽等于分辨率的阶梯.然而,在具有较高分辨率的系统中(≥16位),传输函数 ...

  5. selenium测试(Java)--多表单切换(十二)

    采用下面的例子来编写用例 <!DOCTYPE html> <html> <head> <meta http-equiv="content-type& ...

  6. Latex的各种帽子

    \hat{A} \widehat{A} \tilde{A} \widetilde{A} \overline{A} \underline{A} \overbrace{A} \underbrace{A} ...

  7. Spring零散所得

    Spring容器中bean的id或name,都可以有多个,且第一个为标识符(Qualifier),其余皆为别名(Alias).所以都可以通过applicationContext.getBean(&qu ...

  8. css -- 背景图片自适应屏幕大小

    由于<body>标签的图片不能够拉伸, 解决办法: 1.图片不够大,又background属性不能拉伸图片: 2.只能用个div,把其z-index值设为负,并使这个div大小为整个bod ...

  9. html中可以自定义属性,,,妈的竟然才知道..

    html中可以自定义属性,,,妈的竟然才知道.. <input userinfo="没见过帅哥呀" />

  10. sourcetree管理git

    下载地址: https://www.sourcetreeapp.com/ 跳过注册: 到注册登录页面打开文件目录%LocalAppData%\Atlassian\SourceTree\ 会发现有个文件 ...