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

There is a public bike service in Hangzhou City which provides great
convenience to the tourists from all over the world. One may rent a
bike at any station and return it to any other stations in the city.
The Public Bike Management Center (PBMC) keeps monitoring the real-time
capacity of all the stations. A station is said to be in perfect
condition if it is exactly half-full. If a station is full or empty,
PBMC will collect or send bikes to adjust the condition of that station
to perfect. And more, all the stations on the way will be adjusted as
well.
When a problem station is reported, PBMC will always choose the
shortest path to reach that station. If there are more than one
shortest path, the one that requires the least number of bikes sent from
PBMC will be chosen.


Figure 1
Figure 1 illustrates an example. The stations are represented by
vertices and the roads correspond to the edges. The number on an edge
is the time taken to reach one end station from another. The number
written inside a vertex S is the current number of bikes stored at S.
Given that the maximum capacity of each station is 10. To solve the
problem at S3
, we have 2 different shortest paths:
1. PBMC -> S1
-> S3
. In this case, 4 bikes must be sent from PBMC, because we can collect
1 bike from S1
and then take 5 bikes to S3
, so that both stations will be in perfect conditions.
2. PBMC -> S2
-> S3
. This path requires the same time as path 1, but only 3 bikes sent
from PBMC and hence is the one that will be chosen.

Input Specification:

Each input file contains one test case. For each case, the first line contains 4 numbers: C~max~ (<= 100), always an even number, is the maximum capacity of each station; N (<= 500), the total number of stations; S~p~, the index of the problem station (the stations are numbered from 1 to N, and PBMC is represented by the vertex 0); and M, the number of roads. The second line contains N non-negative numbers C~i~ (i=1,...N) where each C~i~ is the current number of bikes at S~i~ respectively. Then M lines follow, each contains 3 numbers: S~i~, S~j~, and T~ij~ which describe the time T~ij~ taken to move betwen stations S~i~ and S~j~. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print your results in one line. First output the number of bikes that PBMC must send. Then after one space, output the path in the format: 0-&gtS~1~->...-&gtS~p~. Finally after another space, output the number of bikes that we must take back to PBMC after the condition of S~p~ is adjusted to perfect.

Note that if such a path is not unique, output the one that requires minimum number of bikes that we must take back to PBMC. The judge's data guarantee that such a path is unique.

示例1

输入

10 3 3 5
6 7 0
0 1 1
0 2 1
0 3 3
1 3 1
2 3 1

输出

3 0->2->3 0

输入:最大的容量  站台总数量  问题站台下标  路径数量

N个站台每个初始有多少个自行车

起点 终点 花费时间

首先是选择时间最短的路径,如果路径长相同,那么就选送出最少的那个,如果送出的相同,那么就选那个拿回来的最少的路径。有三个标准。

代码来自牛客网:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f

#include <iostream>
#include <vector>
#include <limits.h>
 
using namespace std;
 
void dfs(int start, int index, int end);
 
int cmax, N, sp, M;
int costTimes, outBikes, inBikes;
int resultTimes = INT_MAX;
int resultOutBikes, resultInBikes;
vector<int> bikes, path, resultPath;
vector<vector<int> > times;
vector<bool> visited;
 
int main()
{
    ios::sync_with_stdio(false);
    // 输入数据
    cin >> cmax >> N >> sp >> M;
    bikes.resize(N+1, 0);
    visited.resize(N+1, false);
    times.resize(N+1, vector<int>(N+1, 0));//果然大佬都比较注重空间使用。
//我就直接使用501的数组了。
    for(int i=1; i<=N; i++) {
        cin >> bikes[i];
    }
    int m, n, dist;
    for(int i=0; i<M; i++) {
        cin >> m >> n >> dist;
        times[m][n] = dist;
        times[n][m] = dist;
    }
 
    // 深搜并输出结果
    dfs(0, 0, sp);
    cout << resultOutBikes << " 0";
    for(int i=1; i<resultPath.size(); i++) {
        cout << "->" << resultPath[i];
    }
    cout << " " << resultInBikes;
 
    return 0;
}
 
void dfs(int start, int index, int end)
{
    // 访问
    visited[index] = true;
    path.push_back(index);//放到路径里
    costTimes += times[start][index];
 
    // 处理
    if(index == end) {
        // 计算这条路上带去的车和带回的车
        inBikes = 0, outBikes = 0;
        for(int i=1; i<path.size(); i++) {
            if(bikes[path[i]] > cmax/2) {//如果>,那么就带回,
                inBikes += bikes[path[i]] -cmax/2;
            } else {
                if((cmax/2 - bikes[path[i]]) < inBikes) {//如果还够的话,那么就直接分配。
                    inBikes -= (cmax/2 - bikes[path[i]]);
                } else {//如果不够,那么就算到带出里
                    outBikes += (cmax/2 - bikes[path[i]]) - inBikes;
                    inBikes = 0;
                }
            }
        }
        // 判断这条路是否更好
        if(costTimes != resultTimes) {
            if(costTimes < resultTimes) {
                resultTimes = costTimes;
                resultPath = path;
                resultOutBikes = outBikes;
                resultInBikes = inBikes;
            }
        } else if(outBikes != resultOutBikes) {
            if(outBikes < resultOutBikes) {
                resultPath = path;
                resultOutBikes = outBikes;
                resultInBikes = inBikes;
            }
        } else if(inBikes < resultInBikes) {
            resultPath = path;
            resultOutBikes = outBikes;
            resultInBikes = inBikes;
        }
    } else {
        // 递归
        for(int i=1; i<=N; i++) {
            if(times[index][i] != 0 && !visited[i]) {
                dfs(index, i, end);/
            }
        }
    }
 
    // 回溯
    visited[index] = false;
    path.pop_back();
    costTimes -= times[start][index];
}

//反正这道题目我是不会做的。。

太厉害了。学习了。

使用深搜,参数是当前的点,和将要访问的点,以及end点,每次进入先标记,再判断是否是end,如果不是,那么就再从当前的去循环判断;还有回溯的过程,点标记为未访问过,然后弹出路径,时间减去当前的时间。

本来我想用的是迪杰斯特拉,但是它只能一次遍历,找不到所有的最短路径?是这样嘛?

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

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

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

  2. PAT 1018. Public Bike Management

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

  3. PAT甲级1018. Public Bike Management

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

  4. PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)

    1018 Public Bike Management (30 分)   There is a public bike service in Hangzhou City which provides ...

  5. PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]

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

  6. 1018. Public Bike Management (30)

    时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue There is a public bike service i ...

  7. 1018 Public Bike Management

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

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

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

  9. PTA (Advanced Level) 1018 Public Bike Management

    Public Bike Management There is a public bike service in Hangzhou City which provides great convenie ...

随机推荐

  1. 【软件分析与挖掘】ELBlocker: Predicting blocking bugs with ensemble imbalance learning

    摘要: 提出一种方法——ELBlocker,用于自动检测出Blocking Bugs(prevent other bugs from being fixed). 难度在于这些Blocking Bugs仅 ...

  2. 蓝凌OA常用表整理

    SELECT * FROM V_FI_ORG_EMP  --用户表视图(关联单位)SELECT * FROM FI_ORG_EMP  --用户表 SELECT * FROM FI_ORG_INFO   ...

  3. GoldenGate的监控

    1.进入GoldenGate安装目录,运行GGSCI,然后使用info all查看整体的运行状况 GGSCI (aix212) 1> info all Program Status Group ...

  4. linux系统中关于shell变量$*与$@的区别

    在我们初学linux系统shell时,可能会感觉$@与$*没什么区别,如下面shell脚本: #!/bin/bash# name:a.sh # echo 'this script $* is: '$* ...

  5. Shell for

    for循环一般格式为:for 变量 in 列表do command1 command2 ... commandNdone列表是一组值(数字.字符串等)组成的序列,每个值通过空格分隔.每循环一次,就将列 ...

  6. Solve Error: 'has incomplete type', foward declaration of 'class x'

    在C++的OOB编程中,有时候我们会遇到这样的错误Error: 'has incomplete type',forward declaration of 'class x',那么是什么原因引起的这个问 ...

  7. CodeFirst Update-Database 出现对象'DF__**__**__**' 依赖于 列'**'。

    今天在使用Mirgration更新数据表时,出现这样一个错误 经排查,是由于CodeFirst在创建数据库时会为不可为null的字段创建默认值约束 只要在数据库中删除这个约束就可以解决

  8. Centos 密钥登录系统

    有两台机器一直放在IDC 机房一直没怎么正式使用,今天突然说一个项目要上线,于是赶紧配置好环境,做一些权限控制,之前一直使用的是密码登录,现在正式使用公开了,密码登录方式肯定不安全,于是按照之前的方法 ...

  9. PyQT5-QSlide滑块

    """ QSlider:是一个小滑块组件,这个小滑块能够被拖着一起滑动,用于通常修改具有一定范围的数据 Author: dengyexun DateTime: 2018. ...

  10. CCCC L2-007. 家庭房产 建图 XJB模拟

    https://www.patest.cn/contests/gplt/L2-007 题解:一开始是想直接并查集,一个家就是一个集合,对每个集合维护一个人数num1一个房产数num2 一个房产面积ar ...