题意:求期望红绿灯时间下。途径若干加油站。经过最多若干个红绿灯,起点与终点的最短路。

思路:每一个有红绿灯的节点通过时间怎么算呢?其实t=red*red/2/(red+green),然后把这个时间附加到节点的出边上。

随后我们建立分层图,第i层表示经过了i个红绿灯时,从源点到该点的最短路径长度。

假设没有油量限制。那么我们直接跑最短路即可了。

注意到加油站非常少,于是我们枚举以每一个加油站为起点,向其它加油站经过若干个红绿灯的最短路径。

若此长度不大于最大油量,那么能够直接转移。

我们用上述信息构造新图,依然是分层图,但是每一层仅有50个点,且没有油量限制。

一次最短路出解。

Code:

#include <map>
#include <queue>
#include <string>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;typedef double f2;
#define _abs(x) ((x)>0?

(x):-(x)) #define N 10010 int n, m, dep, lim, cost; bool isGas[N]; f2 length[N]; map<string, int> M; int id, S, T; int Point_id, lab[11][N]; struct Node { int lab; f2 dis; Node(int _lab = 0, f2 _dis = 0):lab(_lab),dis(_dis){} bool operator < (const Node &B) const { return dis < B.dis; } }; void swap(Node &x, Node &y) { Node tmp = x; x = y; y = tmp; } struct Heap { Node a[110010]; int top; Heap():top(0){} void up(int x) { for(; x != 1; x >>= 1) if (a[x] < a[x >> 1]) swap(a[x], a[x >> 1]); else break; } void down(int x) { int son; for(; (x << 1) <= top; ) { son=(((x<<1)==top)||(a[x<<1]<a[(x<<1)|1]))?(x<<1):((x<<1)|1); if (a[son] < a[x]) { swap(a[son], a[x]); x = son; } else break; } } void insert(const Node &x) { a[++top] = x; up(top); } Node Min() { return a[1]; } void pop() { a[1] = a[top--]; down(1); } }H; queue<int> q; struct Graph { int head[110010], next[450010], end[450010], ind; f2 len[450010], dis[110010]; bool inpath[110010]; void reset() { ind = 0; memset(head, -1, sizeof head); } void addedge(int a, int b, f2 _len) { int q = ind++; end[q] = b; next[q] = head[a]; head[a] = q; len[q] = _len; } void spfa(int S) { register int i, j; for(i = 1; i <= Point_id; ++i) dis[i] = 1e10; dis[S] = 0; memset(inpath, 0, sizeof(inpath)); H.top = 0, H.insert(Node(S, 0)); Node tmp; while(H.top) { tmp = Node(0, 0); while(H.top) { tmp = H.Min(); H.pop(); if (!inpath[tmp.lab] && _abs(tmp.dis - dis[tmp.lab]) <= 1e-6) break; } if (tmp.lab == 0) break; inpath[tmp.lab] = 1; for(j = head[tmp.lab]; j != -1; j = next[j]) if (dis[end[j]] > dis[tmp.lab] + len[j]) { dis[end[j]] = dis[tmp.lab] + len[j]; H.insert(Node(end[j], dis[end[j]])); } } } }G1, G2; void Getaddedge(int a, int b, int len) { int j; if (_abs(length[b]) > 1e-7) for(j = 0; j < dep; ++j) G1.addedge(lab[j][a], lab[j + 1][b], len + length[b]); else for(j = 0; j <= dep; ++j) G1.addedge(lab[j][a], lab[j][b], len); } int Gases[101], top; int main() { scanf("%d%d%d%d%d", &n, &m, &dep, &lim, &cost); register int i, j, k, p; for(i = 0; i <= dep; ++i) for(j = 1; j <= n; ++j) lab[i][j] = ++Point_id; string s, s1, s2; int red, green, num; for(i = 1; i <= n; ++i) { cin >> s >> red >> green; num = M[s]; if (!num) M[s] = num = ++id; if (s == "start") S = num; else if (s == "end") T = num; else if (s.find("gas") != string::npos) isGas[num] = 1; if (red) length[num] = red * red / ((f2)2 * (red + green)); } G1.reset(); G2.reset(); int a, b, len; for(i = 1; i <= m; ++i) { cin >> s1 >> s2 >> s >> len; a = M[s1], b = M[s2]; Getaddedge(a, b, len); Getaddedge(b, a, len); } isGas[S] = isGas[T] = 1; for(i = 1; i <= n; ++i) if (isGas[i]) Gases[++top] = i; for(i = 1; i <= top; ++i) { G1.spfa(lab[0][Gases[i]]); for(j = 1; j <= top; ++j) { if (i == j) continue; f2 add = (Gases[j] != S && Gases[j] != T) ? cost : 0; for(k = 0; k <= dep; ++k) if (G1.dis[lab[k][Gases[j]]] <= lim) for(p = 0; p + k <= dep; ++p) G2.addedge(lab[p][Gases[i]], lab[p + k][Gases[j]], G1.dis[lab[k][Gases[j]]] + add); } } G2.spfa(lab[0][S]); f2 res = 1e10; for(i = 0; i <= dep; ++i) res = min(res, G2.dis[lab[i][T]]); printf("%.3lf", res); return 0; }

BZOJ3627 [JLOI2014]路径规划相关推荐

  1. bzoj3627: [JLOI2014]路径规划

    Description 相信大家都用过地图上的路径规划功能,只要输入起点终点就能找出一条最优路线.现在告诉你一张地图的信息,请你找出最优路径(即最短路径).考虑到实际情况,一辆车加满油能开的时间有限, ...

  2. autoware使用rosbag数据生成路径点并进行路径规划(七)

    autoware使用rosbag数据生成路径点并进行路径规划(七) 第一步启动autoware和播放数据包 $ cd ~/autoware.ai $ source install/setup.bash ...

  3. 智能算法的应用记录一点点-----TSP 路径规划

    在研究智能算法的时候,想到怎么应用了吗?单纯的使用基准函 数进行测试就能证明算法是优秀的吗?? 文章链接: [图文]几种智能算法概述及其应用_百度文库 https://wenku.baidu.com/ ...

  4. 基于Dijkstra算法的武汉地铁路径规划!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了 ...

  5. 【路径规划】Astart算法——图文直观解析

    Astart算法详解 1. Astart算法路径搜索原理 2. 栅格网络的Astart算法 3. Astart算法优缺点 1. Astart算法路径搜索原理   Dijkstra算法已经是非常经典的求 ...

  6. 【路径规划】Dijkstra算法——超详细原理图解

    Dijkstra算法详解 1. Dijkstra算法原理  1.1. 有向图的Dijkstra算法  1.2. 无向图和栅格网络的拓展   1.2.1. 无向图   1.2.2. 栅格网络 2. Di ...

  7. 车 局部路径规划与避障

    双目避障 单目避障是否可行? 全局路径规划有RRT.A*.D*. 局部路径规划有DWA.TEB. 控制有 MPC.

  8. 路径规划(Path Planning)与运动规划(Motion Planning)

    路径规划(Path Planning)与运动规划(Motion Planning) 评论区有个观点: 也可以把路径规划理解为运动规划的一份.我个人具体的认识是,特别是在实现的时候,路径规划我们强调的是 ...

  9. 机器人抓取汇总|涉及目标检测、分割、姿态识别、抓取点检测、路径规划

    作者:Tom Hardy Date:2020-02-14 来源:机器人抓取汇总|涉及目标检测.分割.姿态识别.抓取点检测.路径规划

最新文章

  1. 《金蝶ERP—K/3标准财务模拟实训(11.X版)》——第1章 金蝶K/3标准财务介绍 1.1 金蝶K/3标准财务系统介绍...
  2. android怎么实现标题搜索,Android Toolbar上SearchView的实现
  3. 首款鸿蒙系统终端n,荣耀智慧屏正式发布,首款搭载鸿蒙系统终端,家庭C位新选择...
  4. 网际控制报文协议icmp_网络中的ICMP(Internet控制消息协议)
  5. 实用常识 | 推荐一个科研必备计算搜索引擎—WolframAlpha(内含矩阵相关指令操作)
  6. 1.gloox开发环境搭建
  7. Android 系统(181 )----Android中各类.mk文件的编写
  8. 网络编程BaseIO介绍
  9. CCF201412-4 最优灌溉(100分)
  10. table与tr td样式重叠 table样式边框变细
  11. Nginx学习笔记(七)——配置Nginx实现Gzip网页压缩、图片压缩
  12. 《生如夏花》——泰戈尔
  13. AxureRP9 主功能界面
  14. eclipse 的RSE插件不错
  15. Ajax 改造,第 3 部分: 用 jQuery、Ajax 选项卡和照片 carousel 改进现有的站点
  16. 穿越时空的爱恋-Z80 CPU的前世今生
  17. 无源晶振与有源晶振的区别
  18. LeetCode Count Complete Tree Nodes(二分法)
  19. 大衣哥唱火的《火火的情怀》,和合国际会100万向孟文豪收购吗
  20. Python快速上手系列--字典--详解实战篇

热门文章

  1. [Z]建國中學 2012 年資訊科培訓網站
  2. EmEditor学习
  3. 大型企业网络配置系列课程详解(第一版)发布
  4. 数据结构与算法入门---数据结构类型
  5. 偶尔用得上的MySQL操作
  6. 对两个字符串进行比较,取出两个字符串中一样部分的长度
  7. 【翻译】GitHub Pages Basics 基本使用帮助【一】GitHub Pages 是什么?
  8. 100阶乘末尾有多少个零
  9. 垃圾回收算法简单介绍——JVM读书笔记lt;二gt;
  10. Android中获取网络图片的三种方法