每个自行车车站的最大容量为一个偶数cmax,如果一个车站里面自行车的数量恰好为cmax / 2,那么称处于完美状态。如果一个车展容量是满的或者空的(问题车站),控制中心(处于结点0处)就会携带或者从路上收集一定数量的自行车前往该车站,一路上会让所有的车展沿途都达到完美。
注意:沿途所有车站的调整过程必须在前往问题车站的过程中就调整完毕,带回时不再调整。
根据Dijkstra+DFS得到最短路径时(可能有多条),那么对于特定的一条路径来说,计算最少的携带数和最终的带回数(当携带数最少时,最终的带回数是一定的)??
思路:可以把问题转化为另一个更为熟悉的问题,还钱问题。所谓最少携带数即还钱时,需要多少钱,就带多少钱。
假设你借了一部分人的钱,另外也有其他人借了你的钱,但是具体的数值你不知道。接下来要按照确定的顺序去还钱或收钱,计算你最少需要带多少钱,最终剩余多少钱。
注意:不可以收回下一家的钱去还上几家欠的钱。因为你每到一家,必须还钱或收钱,必须有一个结果。
- 初始化变量send=0,为需要从家里带的钱数,collect=0为收回的钱
- 当前家如果欠你钱的话,collect+=欠的钱,send不用更新。
- 你如果欠当前家的钱的话,比较前几家收回的钱和欠的钱的大小,如果够用的话,就不用在家带了,否则在家带。
可以想象,每一家和你自己的家都有一条直通的路,不用经过别家。如果你到了一家发现钱不够的话,就回到家里拿。如果你收回钱了,为了少跑路,直接奔向下一家。
int send = 0, collect = 0; for (int i = tempPath.size()-2;i>=0;i--) { int id = tempPath[i]; if (weight[id] < 0) { if (collect < abs(weight[id])) { send += abs(weight[id]) - collect; collect = 0; } else { collect -= abs(weight[id]); } } else { collect += weight[id]; } } if (send < minSend) { minSend = send; minCollect = collect; path = tempPath; } else if (send == minSend && collect < minCollect) { minCollect = collect; path = tempPath; }