[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 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...
随机推荐
- 教你如何快速上手markdown语法,编写技术博客(史上最全最简,用MarkDown写博客)
首先,进行有道云笔记官网,新建一份markdown文档, 如下图 然后,在文档编辑区,左边,复制如下段落文字 加粗 斜线 标记颜色 下划线 废弃线 一级标题 二级标题 三级标题 四级标题 五级标题 六 ...
- 为什么用上了HTTPS,还是被流量劫持?
广告再临 “老周,有人找你” 一大早,361杀毒公司的老周就被吵醒. 今天的阳光很明媚,老周伸了伸懒腰,这才踱步走向工作室. “是谁一大早的就来吵吵,坏了我的瞌睡”,听得出来,老周有点不太高兴. “咚 ...
- TCP协议三次握手(通信)
在<计算机网络>一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失 ...
- MongoDB -> kafka 高性能实时同步(采集)mongodb数据到kafka解决方案
写这篇博客的目的 让更多的人了解 阿里开源的MongoShake可以很好满足mongodb到kafka高性能高可用实时同步需求(项目地址:https://github.com/alibaba/Mong ...
- qt creator源码全方面分析(2-5)
目录 Creating Wizards in Code 介绍 相关类 IWizardFactory的设置器和获取器 Creating Wizards in Code 介绍 如果基于模板的自定义向导提供 ...
- Sparc V8
Sparc V8指令 在sparc V8手册中p83(Table A-1 Mapping of Synthetic Instructions to SPARC Instructions)有合成指令sy ...
- Vue简介与基础
一.什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于 ...
- 无线网络WPA加密算法基础
2013-11-13 23:08 (分类:网络安全) 对无线没什么认识,总听说有人蹭网,还有卖蹭网器的,于是补充一下知识. 无线加密有两类:WEP WAP,目前采用WEP加密的非常少了,WEP应该只是 ...
- Linux学习小记(2)---installation
安装一方面需要注意镜像的定位问题,另一方面是在我的双显卡笔记本上,总是进不去安装界面和启动失败,我的原因是驱动问题,需要在启动参数加上nouveau.mideset=0,或者nomodeset等指令来 ...
- 面型对象和UML类图
面向对象 why? 1.程序执行:顺序,判断,循环,----结构化 2.面向对象----数据结构化 3.面向计算机,结构化的才是最简单的 4.变成应该 简单&抽象 一个基本的类 class P ...