BZOJ3627: [JLOI2014]路径规划
Description
相信大家都用过地图上的路径规划功能,只要输入起点终点就能找出一条最优路线。现在告诉你一张地图的信息,请你找出最优路径(即最短路径)。考虑到实际情况,一辆车加满油能开的时间有限,所以在地图上增加了几个加油站。
地图由点和双向边构成,每个点代表一个路口,也有可能是加油站或起点终点。有些路口还装有红绿灯。由于经过太多的红绿灯会让人感到不爽,所以请求在经过不超过k个红绿灯的情况下,最少平均花费多少时间能从起点到终点。保证起点终点和加油站没有红绿灯。
(题目不考虑最坏情况下能否加到油,只考虑平均花费时间的前提下,车能否到达加油站加油)。
Input
第一行输入5个整数n,m,k,limit,cost,表示有n个点m条边,车能开limit长的时间,及加油所花时间cost。
接下来n行输入每个点信息,包括点的名称(带“gas”的为加油站,“start”为起点,“end”为终点),及该点是否有红绿灯,(a,b表示)(若为a=0则表示没有,a表示红灯长,b表示绿灯长)。
接下来m行输入每条边信息,包括边的起点,终点,边的名称,通过该边所花时长。
保证点和边名的长度不大于20,只有大小写字母,数字及‘_’组成。
Output
一行输出最少平均花费时长。
Sample Input
start 0 0
azhan 10 10
xxgasxx 0 5
bpoint 20 5
end 0 100
start azhan sdf 30
azhan xxgasxx ewfg 20
start end r3tg 200
end azhan 1xq2 70
azhan bpoint gg 10
xxgasxx bpoint kk 30
bpoint end dsg 40
xxgasxx end t_s 100
Sample Output
HINT
共14组数据:
其中3组数据,满足n<10,m<20,k<5
另有3组没有红绿灯
所有数据满足n<=10000,m<=20000,k<=10,加油站<=50
答案保留3位小数
题解Here!
题目大意:
给定一个无向图,每条边有边权,有些点有点权,一些点是加油站。
求一条起点到终点的最短路,使经过有点权的点不超过$k$次,一管油只能走$limit$的时间,时间到了就只能到加油站花$cost$的时间加油。
解法:
那个红绿灯的计算公式是$\frac{red^2}{2\times(red+green)}$。
然后把这个时间附加到节点的出边上。
然后,我们建立分层图:
第$i$层表示经过了$i$个红绿灯时,从源点到该点的最短路径长度。
如果没有油量限制,那么我们直接跑最短路就行了。
所以我们考虑如何去掉这个油量限制。
注意到加油站很少,于是我们枚举以每个加油站为起点,向其他加油站经过若干个红绿灯的最短路径。
若此长度不大于最大油量,那么可以直接转移。
我们用这种方法构造新图,依旧是分层图,可是每一层仅有$50$个点,且没有油量限制。
然后就能跑分层图$SPFA$了。
注:不知道为什么,我的$SPFA$要加上$SLF$优化才能过,否则就是#4 $TLE$。
附代码:(我自己都觉得好丑啊。。。)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
#include<string>
#include<deque>
#include<cmath>
#define MAXN 10010
#define MAXM 200010
#define eps (1e-7)
#define MAX (1<<30)
using namespace std;
map<string,int> name;
int n,m,k,cost,limit,s,t;
int top=0,gas_stack[MAXN],id[MAXN][12];
double length[MAXN];
bool gas[MAXN];
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
struct SPFA{
int c,head[MAXM];
double path[MAXM];
bool vis[MAXM];
SPFA(){c=1;}
struct Graph{
int next,to;
double w;
}a[MAXM<<2];
inline int relax(int u,int v,double w){
if(path[v]>path[u]+w){
path[v]=path[u]+w;
return 1;
}
return 0;
}
inline void add(int u,int v,double w){
a[c].to=v;a[c].w=w;a[c].next=head[u];head[u]=c++;
}
void spfa(int s){
int u,v;
deque<int> q;
for(int i=1;i<=n*(k+1);i++){path[i]=MAX;vis[i]=false;}
path[s]=0;
vis[s]=true;
q.push_back(s);
while(!q.empty()){
u=q.front();
q.pop_front();
vis[u]=false;
for(int i=head[u];i;i=a[i].next){
v=a[i].to;
if(relax(u,v,a[i].w)&&!vis[v]){
vis[v]=true;
if(!q.empty()){
if(path[v]>path[q.front()])q.push_back(v);
else q.push_front(v);
}
else q.push_back(v);
}
}
}
}
}one,two;
inline void add_edge(int u,int v,int w){
if(fabs(length[v])>eps)for(int j=0;j<k;j++)one.add(id[u][j],id[v][j+1],w+length[v]);
else for(int j=0;j<=k;j++)one.add(id[u][j],id[v][j],w);
}
void work(){
double ans=MAX;
two.spfa(s);
for(int i=0;i<=k;i++)ans=min(ans,two.path[t+i*n]);
printf("%.3lf\n",ans);
}
void init(){
string x;
int u,v;
double w;
n=read();m=read();k=read();limit=read();cost=read();
for(int i=0;i<=k;i++)
for(int j=1;j<=n;j++)
id[j][i]=j+i*n;
for(int i=1;i<=n;i++){
cin>>x;
name[x]=i;
int red=read(),green=read();
if(x=="start")s=i;
else if(x=="end")t=i;
if(x.find("gas")!=string::npos)gas[i]=true;
if(red)length[i]=1.00*red*red/(double)(2.00*(red+green));
else length[i]=0;
}
for(int i=1;i<=m;i++){
cin>>x;u=name[x];
cin>>x;v=name[x];
cin>>x;w=read();
add_edge(u,v,w);
add_edge(v,u,w);
}
gas[s]=gas[t]=true;
for(int i=1;i<=n;i++)if(gas[i])gas_stack[++top]=i;
for(int i=1;i<=top;i++){
one.spfa(gas_stack[i]);
for(int j=1;j<=top;j++){
if(i==j)continue;
w=(gas_stack[j]!=s&&gas_stack[j]!=t)?cost:0;
for(int l=0;l<=k;l++)
if(one.path[id[gas_stack[j]][l]]<=limit)
for(int p=0;p+l<=k;p++)
two.add(id[gas_stack[i]][p],id[gas_stack[j]][p+l],one.path[id[gas_stack[j]][l]]+w);
}
}
}
int main(){
init();
work();
return 0;
}
BZOJ3627: [JLOI2014]路径规划的更多相关文章
- 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
3627: [JLOI2014]路径规划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 186 Solved: 70[Submit][Status] ...
- 基于谷歌地图的Dijkstra算法水路路径规划
最终效果图如下: 还是图.邻接表,可以模拟出几个对象=>节点.边.路径.三个类分别如下: Node 节点: using System; using System.Collections.Gene ...
- Unity路径规划
Unity路径规划 转自:http://www.cnblogs.com/zsb517/p/4090629.html 背景 酷跑游戏中涉及到弯道.不规则道路. 找来一些酷跑游戏的案例来看,很多都是只有 ...
- iOS百度地图路径规划和POI检索详细总结-b
路径规划.png 百度地图的使用 百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧.坑一: 奥联WIFI_xcodeproj.png 如上图所示,在infoplist里 ...
- COJ 0500 杨老师的路径规划(MST)最小生成树
杨老师的路径规划(MST) 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 为满足同学们需求,杨老师在实验楼4层新建了好多个计算 ...
- octomap中3d-rrt路径规划
路径规划 碰撞冲突检测 在octomap中制定起止点,目标点,使用rrt规划一条路径出来,没有运动学,动力学的限制,只要能避开障碍物. 效果如下: #include "ros/ros.h&q ...
- ROS(indigo)RRT路径规划
源码地址:https://github.com/nalin1096/path_planning 路径规划 使用ROS实现了基于RRT路径规划算法. 发行版 - indigo 算法在有一个障碍的环境找到 ...
- ROS探索总结(十四)——move_base(路径规划)
在上一篇的博客中,我们一起学习了ROS定位于导航的总体框架,这一篇我们主要研究其中最重要的move_base包. 在总体框架图中可以看到,move_base提供了ROS导航的配置.运行.交互接口,它主 ...
- 游戏AI之路径规划(3)
目录 使用路径点(Way Point)作为节点 洪水填充算法创建路径点 使用导航网(Navigation Mesh)作为节点 区域分割 预计算 路径查询表 路径成本查询表 寻路的改进 平均帧运算 路径 ...
随机推荐
- linux内核栈与用户栈【转】
转自:http://19880512.blog.51cto.com/936364/274610 最近linux内核的中断部分,总是被书里的栈弄晕,一会儿内核栈,一会儿用户栈的……很是崩溃,在网上goo ...
- 根据ipnut的maxlength实时提示输入的字符长度
$(function(){ $("body").on("focus","input,textarea", function() { if(! ...
- Codeforces635C XOR Equation【数学】
题目链接: http://codeforces.com/contest/635/problem/C 题意: 给定两个数的和s及异或x,求两个数的可能情况. 分析: 我们有公式a+b=a& b∗ ...
- 洛谷——P1078 文化之旅
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...
- JAVA算法总结_时间复杂度_Demo
JAVA面试中经常问到排序算法问题,本人结合网络上一些资源整理了编写一下常用的Demo,并附带运行结果,希望能帮助到大家. /** * @Title: 冒泡排序 * @Description: 将数组 ...
- 讯飞语音识别Android-Demo
import java.io.UnsupportedEncodingException; import android.app.Activity; import android.os.Bundle; ...
- Android动画中Interpolator 详解和演示
遇到一个项目需求,想让动画变得更活泼一点,于是想到了动画属性中的Interpolator,写了基本例子测试一下Android提供给我们现成的加速器的效果: 效果 代码中方法 xml中属性 越来越快 A ...
- U-net图像分割
[Keras]基于SegNet和U-Net的遥感图像语义分割 2014 年,加州大学伯克利分校的 Long 等人提出全卷积网络(FCN),这使得卷积神经网络无需全连接层即可进行密集的像素预测,CNN ...
- 学会用core dump调试程序错误
最来在项目中遇到大型程序出现SIGSEGV ,一直不知道用core dump工具来调试程序,花了近一周的时间,才定位问题,老大很生气,后果很严重,呵呵,事后仔细学习了这块的知识,了解一点core du ...
- yii框架:CDbConnection failed to open the DB connection: could not find driver的解决的方法
这个问题是由于php中缺少pdo mysql造成的. 解决方法是为php加入此扩展.前往你最早的php安装文件,进入ext/pdo_mysql/文件夹下,然后./configure --with-ph ...