[PAT] A1018 Public Bike Management
【思路】
题目生词
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的更多相关文章
- PAT A1018 Public Bike Management (30 分)——最小路径,溯源,二标尺,DFS
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- PAT 1018 Public Bike Management[难]
链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018 Public ...
- PAT甲级——A1018 Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- PAT 1018. Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- A1018. Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- PAT 1018 Public Bike Management(Dijkstra 最短路)
1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- pat 甲级 Public Bike Management
Public Bike Management (30) 题目描述 There is a public bike service in Hangzhou City which provides grea ...
- PAT_A1018#Public Bike Management
Source: PAT A1018 Public Bike Management (30 分) Description: There is a public bike service in Hangz ...
- PAT甲级1018. Public Bike Management
PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...
随机推荐
- 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 的设计原理和管理机制
一.缓冲池(Buffer Pool)的地位 在<MySQL 学习总结 之 InnoDB 存储引擎的架构设计>中,我们就讲到,缓冲池是 InnoDB 存储引擎中最重要的组件.因为为了提高 M ...
- Codeforces Round #617 (Div. 3) D. Fight with Monsters
D : Fight with Monsters 题目大意 : 有一组数,每个值对应着一个怪物的 hp 值,现在有两个人,一个自己一个对手,每个人有一个攻击值, 两个人轮流攻击怪物,如果是自己将怪物先打 ...
- Java范型学习笔记
对于范型的使用或者说印象只有集合,其他地方即使使用过也不知道,反正就是只停留在List<E> Map<K, V>,最近刚好闲来无事,就找找资料学习一下:下列为个人学习总结,欢迎 ...
- Python3(七) 正则表达式与JSON
一. 初识正则表达式 1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配. 2.作用:可以实现快速检索文本.实现替换文本的操作. 3.场景: 1.检测一串数字是否是 ...
- Hapi+MySql项目实战自动化文档生成(四)
自动化生成swagger文档 使用hapi插件hapi-swagger,简单配置下插件,先修改下plugin_config.js文件: //plugin_config.js const Swagger ...
- ELF文件之八——使用链接脚本-2个函数-data-bss-temp-call-debug信息
gcc编译选项可以设置生成调试信息, debug信息格式有stabs,coff,xcoff,dwarf. 常用的有两种格式,stab和dwarf,stab较早,dwarf较新.两种格式介绍:https ...
- Android studio 断点调试整理
一. 开始断点调试 点击debug开始调试
- 你应该了解的 Java SPI 机制
前言 不知大家现在有没有去公司复工,我已经在家办公将近 3 周了,同时也在家呆了一个多月:还好工作并没有受到任何影响,我个人一直觉得远程工作和 IT 行业是非常契合的,这段时间的工作效率甚至比在办公室 ...
- 学习shiro最佳实践,绝对正确
按照https://blog.csdn.net/qq_34021712/column/info/26947学习,基本能解决shiro一切问题,谢谢该博主
- python制作ico图标
import PythonMagick img = PythonMagick.Image('image.png') img.sample('64x64') img.write('image_64x64 ...