Dij二级最短路
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
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.
that x and y are both integers, and no two crocodiles are staying at the same position.
4 10
17 0
27 0
37 0
45 0
1 10
20 30
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二级最短路的更多相关文章
- PAT 1087【二级最短路】
二级最短路+二级最短路,就是DP过程吧. 代码稍微注释一些,毕竟贴代码不好.. #include<bits/stdc++.h> using namespace std; typedef l ...
- 51nod1459【二级最短路】
标签说的是BFS... 太菜,不知道怎么BFS...是不是spfa写,就叫BFS...感觉不是.... 只是二级最短路的写法,直接搞就很容易了,简单题: #include <bits/stdc+ ...
- 链式前向星实现的堆优化dij求最短路模板
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...
- UVA 10801 Dij最短路(改模板)
题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间: 思路:Dij求最短路.如果是另一条路比 ...
- Codeforces 545E. Paths and Trees 最短路
E. Paths and Trees time limit per test: 3 seconds memory limit per test: 256 megabytes input: standa ...
- vijos 1423 最短路or环(有向图)
最佳路线 描述 年久失修的赛道令国际汽联十分不满.汽联命令主办方立即对赛道进行调整,否则将取消其主办权.主办方当然必须马上开始行动. 赛道测评人员经过了三天三夜的数据采集,选出了若干可以使用的道路和各 ...
- 【BZOJ2622】[2012国家集训队测试]深入虎穴 次短路
[BZOJ2622][2012国家集训队测试]深入虎穴 Description 虎是中国传统文化中一个独特的意象.我们既会把老虎的形象用到喜庆的节日装饰画上,也可能把它视作一种邪恶的可怕的动物,例如“ ...
- Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)
跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...
- DIJ的优化,和spfa的优化
SPFA和DIJ求最短路的算法的坑点一直是很多的.经常会让人搞不懂. 易错案例: 用重载运算符来排序,如: struct cmp { bool operator ()(int x, int y) co ...
随机推荐
- 符号arg含义
argument of the maximum/minimum arg max f(x): 当f(x)取最大值时,x的取值 arg min f(x):当f(x)取最小值时,x的取值 表示使目标函数取最 ...
- 每个Web开发者都应该知道的关于URL编码的知识
本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们经常遇到的问题及其解决方案.本文并不特定于某类编程语言,我们在Java环 ...
- 《FPGA全程进阶---实战演练》第二章之焊接板子及调试注意事项
1.若是读者第一次做板子,强烈建议画完PCB板后将PCB图打印出来,然后对照你买的芯片将芯片放置对 应的位置,然后查看所有的封装格式适不适合,否则等你做出板子来后再试,为时晚矣.笔者虽然知道要这么 做 ...
- 关于Unity中使用刚体制作简单跑酷案例
一.步骤 1.创建一个Canvas 2.对Canvas进行初始化,记得把Game视图的分辨率调成和Canvas里面设置的一样的分辨率960X640 3.创建一个Image的UI节点作为Canvas的子 ...
- 【转】浅谈.net remoting 与webservice
1. .NET Remoting .NET Remoting是微软随.NET推出的一种分布式应用解决方案,被誉为管理应用程序域之间的 RPC 的首选技,它允许不同应用程序域之间进行通信(这里的通信可以 ...
- Zookeeper 基础
在深入了解ZooKeeper的运作之前,让我们来看看ZooKeeper的基本概念.我们将在本章中讨论以下主题:1.Architecture(架构)2.Hierarchical namespace(层次 ...
- c++下面的一个单例
Public FileManager { private FileManager(); public static FileManager Instance=new FileManager(); } ...
- 【转载】PADS Layout将导入DXF,并转换成板框步骤
1.在PADS Layout中选择 Import... 2.选择DXF文件(一般由结构工程师给出),直接点OK即可. 3.导入后,板框图一角视图如下.右键选择 Select Shapes,然后双击外框 ...
- 【Java面试题】11 什么是内部类?Static Nested Class 和 Inner Class的不同。
Inner Class(内部类)定义在类中的类. (一般是JAVA的说法) Nested Class(嵌套类)是静态(static)内部类.(一般是C++的说法)静态内部类:1 创建一个static内 ...
- 学习 TList 类的实现[6]
实现 TMyList.Add 函数. TList 中的 Add 函数用到了一个 Grow 方法, 它的原理是元素越多就为以后准备更多内存, 我们这里省略为预留 4 个元素的内存; TList 中的 A ...