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 ...
随机推荐
- Js加密与解密
<html><head><META HTTP-EQUIV="MSThemeCompatible" CONTENT="Yes"> ...
- 成员函数后面加const,没有const,以及使用的区别
函数后面加const 编译器会自动给每一个函数加一个this指针.在一个类的函数后面加上const后,就表明这个函数是不能改变类的成员变量的(加了mutable修饰的除外,后面有讲).实际上,也就是对 ...
- MySQL中乐观锁和悲观锁 原理、区别
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...
- imx6 电容屏参数更改
imx6使用电容屏时需要获取对应的usb的event.其中用到了shell的一些命令.分析如下. # inputCheckLine=`cat /proc/bus/input/devices | gre ...
- 说一下zoom:1的原理,万一被问到呢?
某一天.前同事低着头从鹅厂面试回来.他说他被一道非经常见的问题难倒了. 对方问他知道zoom:1的作用吗? 前同事:清楚浮动啊,触发haslayout. 再问:那你知道zoom:1的工作原理和来龙去脉 ...
- CleanMyMac 4破解版-最强中文版_破解版_激活码_注册码
最新版CleanMyMac 4中文版本已经发布了,也受到了广大用户的喜爱.众所周知, 注册码是开启软件的钥匙,在获取软件安装包之后需要有效的注册码才能激活软件.但是关于CleanMyMac 4注册码的 ...
- php获取QQ头像并显示的方法
鉴于此,我在想一个大众化的,比较简单的方法,我想到的是对于没有头像的朋友调用其QQ头像, 因为QQ现在至少是人手一个,所以只需要留言时填写QQ号,然后调用其头像,这样一来就方便多了. 首先是获取QQ的 ...
- POI-根据Cell获取对应的String类型值
/** * 根据不同情况获取Java类型值 * <ul><li>空白类型<ul><li>返回空字符串</li></ul>< ...
- php 在windows下配置虚拟目录的方法
1.先找到apache的配置文件 httpd.conf 找如如下代码: # Virtual hosts#Include conf/extra/httpd-vhosts.conf 把# Include ...
- linux定时任务cron 安装配置
名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表. 软件包安装: 要使用cron服务,先要安装vixie-cron软件包和crontabs软件包,两个软件包作 ...