【思路】

题目生词

figure

n. 数字

v. 认为,认定;计算;是……重要部分

The stations are represented by vertices and the roads correspond to the edges.

顶点表示车站,边表示道路。

correspond to 相当于

capacity

n. 能力;容量

题目大意:给出需要调整的车站编号,从0处出发,一路上顺便调整途径的车站,使得每个车站的车辆数是Cmax的一半,多的带走少的补齐。选最短路,最短相同选从0处带的车最少的路,若还相同则选择带回0处的车最少的路。

输出要带的车辆数,路径,带回的车辆数(返回时直接回,不再调整)。

方法:Dijkstra + DFS。先用Dijkstra算法算出最短路径,只考虑时间最短,建立vector保存路径的前驱节点。然后用DFS遍历每一条路径,获得一条路径后(即遍历到了起始节点0)计算带去带回的车辆,确定最佳方案。

计算带去、带回车辆数的方法:对于每个站点,考虑前一个站点传递下来的车辆数trans和自己的车辆数bike[i]相加的结果与cmax/2的差,分两种情况——一,差值为负,即车不够,要从0处带车,所以bring的值增加其差值的绝对值,而传递给下去的车辆数trans置为0;二,差值非负,表示车够了,多出的车赋值给trans传递到下一个站点,bring的值保持。一开始bring和trans的值为0,从出发节点的下一个节点(即0号节点的下一个节点)开始遍历计算。最终bring为要从0处携带的车辆数,trans即带回的车辆数。注意,有关从0处带多少车,只与当前走过的车站有关,即不管后面站点车再多,前面的车不够了,就要从0处带(因为走路不会回头,携带的车辆数是随着路径的推进而变化的)。而DFS是从终点向前推到起点结束,则必须要求完整条路径才能算的出来。最后倒着输出变长数组的值,即为路径。

【tips】要熟练运用Dijkstra+DFS求最佳路径的算法!

【AC代码】

 #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
#define N 502
#define INF 100000000
int cmax, stations, goal, roads;
int bike[N];
int length[N][N] = { {} };
bool vis[N] = {};
int d[N];
vector<int>pre[N];
vector<int>path;
int minbring = INF, minback = INF;
vector<int>bestpath;
void DFS(int v)
{
if (v == ) //到边界--起始节点。
{
//计算第二、三标尺的值,即带去、带回的车辆数。
path.push_back(v);
int bring = ;
int trans = ;
for (int i = path.size() - ; i >= ; i--)
{
int u = path[i];
if (bike[u] + trans >= cmax / )
{
trans += bike[u] - cmax / ;
}
else
{
bring += cmax / - bike[u] - trans;
trans = ;
}
}
//更新最优值。
if (bring < minbring)
{
bestpath = path;
minbring = bring;
minback = trans;
}
else if (bring == minbring)
{
if (trans < minback)
{
bestpath = path;
minback = trans;
}
}
path.pop_back();
return;
}
int i;
path.push_back(v);
for (i = ; i < pre[v].size(); i++)
{
DFS(pre[v][i]);
}
path.erase(path.end() - );//可以写成path.pop_back();
}
void Dijkstra(int s)
{
int i, j;
fill(d, d + N, INF);
d[s] = ;
for (i = ; i <= stations; i++)
{
//找不在s集中的d最小
int min = INF, u = -;
for (j = ; j <= stations; j++)
{
if (min > d[j] && vis[j] == )
{
min = d[j];
u = j;
}
}
if (u == -)return;
vis[u] = true;
//对于通过u能到s的点v,更新路径
for (j = ; j <= stations; j++)
{
if (length[u][j] && vis[j] == )
{
if (d[u] + length[u][j] < d[j])
{
d[j] = d[u] + length[u][j];
pre[j].clear();
pre[j].push_back(u);
}
else if (d[u] + length[u][j] == d[j])
{
pre[j].push_back(u);
}
}
} }
} int main()
{
cin >> cmax >> stations >> goal >> roads;
int i;
for (i = ; i <= stations; i++)
cin >> bike[i];
for (i = ; i < roads; i++)
{
int u, v;
cin >> u >> v;
cin >> length[u][v];
length[v][u] = length[u][v];
}
Dijkstra();
DFS(goal);
cout << minbring << "";
for (i = bestpath.size() - ; i >= ; i--)
{
cout << "->" << bestpath[i];
}
cout << " " << minback;
return ;
}

[PAT] A1018 Public Bike Management的更多相关文章

  1. PAT A1018 Public Bike Management (30 分)——最小路径,溯源,二标尺,DFS

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  2. PAT 1018 Public Bike Management[难]

    链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018  Public ...

  3. PAT甲级——A1018 Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  4. PAT 1018. Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  5. A1018. Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  6. PAT 1018 Public Bike Management(Dijkstra 最短路)

    1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  7. pat 甲级 Public Bike Management

    Public Bike Management (30) 题目描述 There is a public bike service in Hangzhou City which provides grea ...

  8. PAT_A1018#Public Bike Management

    Source: PAT A1018 Public Bike Management (30 分) Description: There is a public bike service in Hangz ...

  9. PAT甲级1018. Public Bike Management

    PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...

随机推荐

  1. 2020牛客寒假算法基础集训营4 E:最小表达式

    E:最小表达式 考察点 : 贪心,高精度 坑点 : 高精度一定不要写错,一定一定不要写错 剩下的就是细节问题 侃侃 : 1.字符串长度达到 5e5,如果要涉及到加法,乘法,普通的肯定会爆 long l ...

  2. Angular 从入坑到挖坑 - 组件食用指南

    一.Overview angular 入坑记录的笔记第二篇,介绍组件中的相关概念,以及如何在 angular 中通过使用组件来完成系统功能的实现 对应官方文档地址: 显示数据 模板语法 用户输入 组件 ...

  3. 浮动和包含框的关系,伪元素after解决高度塌陷

    浮动会使元素尽量向左或向右移动,直到碰到包含框或另外一个浮动元素的盒子模型的边缘 包含框并不会改变里面浮动元素的宽高,浮动元素宽高不会限制在包含块以内 <!DOCTYPE html> &l ...

  4. 子组件获取父组件数据 propsDown, 父组件获取子组件数据 eventUp

    (一) popsDowm 三种方法获取父组件数据:被动获得(1):主动获取(2). 1.被动获得: 父组件:v-bind: 绑定变量参数和方法参数:子组件:props 接收参数.可以在模板中直接使用也 ...

  5. css中的盒子模型是什么?

    什么是CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封装周 ...

  6. 安卓接入融云IM连接不上??

    融云初始化失败?融云连接失败??连接回调方法不执行???不可能的,就那么几行代码,怎么会有错. 1.项目gradle里添加融云maven仓库 maven {url "https://dl.b ...

  7. 痞子衡嵌入式:ARM Cortex-M内核那些事(6)- 系统堆栈机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M堆栈机制. 今天给大家分享的这篇依旧是2016年之前痞子衡写的技术文档,花了点时间重新编排了一下格式.前面痞子衡 ...

  8. .Net框架的模块代码生成器--其三(dotnet tool指令的参数)

    别人已经写好了一个这种处理指令参数的库,我们这里是使用别人的库来实现规范的指令系统 继续上一篇的gfile或者新建一个.Net Core控制台程序也可以 1.安装nuget包,程序包管理器控制台运行 ...

  9. C++中字符常量与字符常量不能直接相加

    定义string变量,并进行初始化,如下: string s1 = "Hello"; string s2 = s1 + "World"; string s3 = ...

  10. 使用placeholder属性设置input文本框的提示信息

    input文本框中设置提示信息,可以使用placeholder属性 <!DOCTYPE html> <html> <head> <meta charset=& ...