解题过程的小记录,如有错误欢迎指出。
难度:四星(Dijkstra+DFS,难点在DFS中第二权重的比较)
题目分析
有一个共享单车总部和各个分部,给出每个分部现有的车辆数,给出要修正的终点,要求将这个终点和沿途的每一个分部都修正为完美车辆数的情况(完美车辆数=车辆存储容量的一半),要求选择的路径时间最短,当时间相同时要求从总部运出的车辆数最少,当时间和从总部运出的车辆数都相同时,要求运回总部的车辆数最少
注意点
- 修正要求在经过某点的第一次就完成,不能把后面要经过的点多出的车辆再返还给前面的点
- 上一个点的多出的车辆数可以给后面的点补充,但后面的点多出的车辆数不可以给前面的点补充
- Path和tempPath记录的都是从起点开始的逆序数列
我的解题过程
思路
本题为Dijkstra+DFS的模板题,难点在DFS中第二权重的比较,需要设置两个临时变量记录总共需要补充的车辆数和需要运回的车辆数,具体见代码DFS部分
bug
- 原来用time当做全局变量用来表示到每一点的最短时间,在VS2017中可以运行但是提交会报错,百度后发现是因为在库里面已经有了time这个变量名,不能重定义所以报错,改为Time后提交可以运行
- 原来的思路错了,原来想的是算出总共缺多少或者多出多少再补上或运回即可(在这种思路下,运回和寄出必有一者为0),但实际上本题要求在从出发点到目的点所经过的每一个点时(第一次经过)就使之达到完美状态
- 老眼残选手,打错了一个比较变量
代码
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
const int MAXN = 505;
const int INF = 1000000000;
int capcity, n, ed, m;
int bikes[MAXN];
int T[MAXN][MAXN];//两地之间需要花的时间
int Time[MAXN];
bool vis[MAXN] = {
false };
vector<int> pre[MAXN], tempPath, Path;
int send = INF, back = INF, temps, tempb, tempnow;
void Dijkstra(int s) {
//找最短时间路径的前驱
fill(Time, Time + MAXN, INF);
Time[s] = 0;
for (int i = 0; i <= n; i++) {
int u = -1, MIN