【思路】

题目生词

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. Go语言实现:【剑指offer】替换空格

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数,将一个字符串中的每个空格替换成"%20". 例如,当字符串为We Are Happy.则经过替换之后的字符串 ...

  2. 《 Java 编程思想》CH08 多态

    在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征. 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来. "封装"通过合并特征和行为来创建新的数据类 ...

  3. Spring Boot从入门到精通(二)配置GitHub并上传Maven项目

    简单介绍一下GitHub,它是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管,故名GitHub. GitHub于2008年4月10日正式上线,除了Git代码仓库托管 ...

  4. 使用 H5 和 webGL 的智慧城市 3D 监控

    前言 中共中央.国务院在今年12月印发了<长江三角洲区域一体化发展规划纲要>(下文简称<纲要>),并发出通知,要求各地区各部门结合实际认真贯彻落实. <纲要>强调, ...

  5. java中list的sort()功能如何使用?如果倒序如何正序?

    list.sort()接收一个Comparable接口,其中compare方法是必须实现的,int compare(T o1, T o2);,它接受两个参数:o1,o2. o2表示list排序前的前值 ...

  6. Python LEGB (Local, Enclosing, Global, Build in) 规则

    Local 一个函数定义了一个 local 作用域; PyFrameObject 中的 f_local 属性 Global 一个 module 定义了一个 global 作用域; PyFrameObj ...

  7. centos6.5安装openLDAP2.3

    查看系统版本,内核,定时任务同步时间,关闭防火墙selinux等 [root@ldap-master ~]# cat /etc/redhat-release CentOS release 6.5 (F ...

  8. redis系列-14点的灵异事件

    概述 项目组每天14点都会遭遇惊魂时刻.一条条告警短信把工程师从午后小憩中拉回现实.之后问题又神秘消失.是PM喊你上工了?还是服务器给你开玩笑?下面请看工程师如何一步一步揪出真凶,解决问题. 如果不想 ...

  9. C语言三(2)

    多重 if...else....else 结构 语法: if(条件1) { 语句1; } else if(条件2) { 语句2; } else if(条件3) { 语句3; } else { 语句N; ...

  10. IO包中的RandomAccessFile类

    RandomAccessFile RandomAccessFile 是随机访问文件的类.它支持对文件随机访问的读取和写入,即我们也可以从指定的位置读取/写入文件数据,因为该类在其内部封装了一个数组和指 ...