外卖骑手需要在给定的起始地点 Sn 和总工作时间 t 内,依次选择若干订单进行配送。每个订单由出发站点 s、到达站点 d 和配送费 p 三元组表示,且 s=d。若同一对 (s,d) 存在多笔订单,可将它们合并,合并后耗时仍为 1 单位,但收入为这批订单费用之和。每次配送无论合并与否,均耗时 1,且每笔订单只能配送一次。配送结束条件为工作时间用尽或当前地点无可接订单。输出骑手可获得的最大总收入及对应路径,若多条路径收入相同,则取字典序最小的路径。
外卖骑手是一个和时间赛跑的工作。由于外卖订单一般集中在一日三餐的时间,具有时间短突发量大的特点,骑手们需要在订单集中的时间段内尽可能送出更多的订单以获得更多的收入。
骑手的工作流程大致是这样的,从一个商家出发,选择一个订单,送到目的地点,在目的地点接新的订单送到下一个目的地,如此循环。一个订单只能配送一次,骑手不能重复配送相同的订单。
从出发地点到取的地点的一次配送需要消耗1单位的时间。同一个地点可能发出多笔订单,其中一些订单可能要送往同一个目的地,这些起点和终点相同的订单可以合并配送,合并配送的多笔订单和单笔订单一样都只消耗1单位的时间。
简化起见,我们不区分商家和配送目的地点,统一视作地图上的一个地点。骑手的工作时间总时间是给定的,如果剩余的工作时间为0,则配送工作结束;如果到达目的地点之后,没有再从该地点发出的订单,则配送工作结束。
假设地图上有N个地点,每个地点有[0,X]个待送出的订单,每个订单以[s,d,f]来表示,一共有M个订单。其中s是出发站点编号,d是目的站点编号,p是这笔订单的配送费,约定s !=d。给定骑手的出发地点编号Sn和工作总时间t,请计算出骑手最多能获得的收入。
具体每个取值的范围说明:
第1行为空格分隔的2个整数,分别表示骑手的出发地点编号Sn和工作总时间t;
第2行为一个表示订单数量的整数M;
第3行开始的M行每行都是以空格分隔的3个整数s,d和p,s表示出发站点,d表示目标站点,p表示订单收入。
第1行是一个整数,表示骑手能获得的最多的收入;
第2行是空格分隔的整数数组,每个数字是一个地点编号,表示从开始到结束的配送路径。当多个路径能够获取相同的收入时,输出从前往后数字序最小的路径。
输入
0 2
6
0 1 2
0 5 3
5 3 3
1 2 3
2 4 10
1 3 4
输出
6
0 1 3
说明
如图所示:
工作时间t为2的条件下,从0出发,节点4不可达,可选的线路是:
1,0−>1−>3收入是2+4=6
2,0−>5−>3收入是3+3=6
2,0−>1−>2收入是2+3=5
线路1和线路2的收入最大,都是6,选择数字序最小的路径0−>1−>3,输出总收入6和线路0 1 3
输入
3 2
5
3 4 10
4 5 5
4 5 10
4 5 15
5 6 20
输出
40
3 4 5
说明
如图所示:
工作时间t为2的条件下,可以进行2次配送,其中从3到4消耗1的时间,可以获取收入10。从4到5有3个订单,这3个订单的起终点相同(都是从4到5),可以合并配送,收入5+10+15=30,只消耗1的时间。
所以唯一的路线是3−>4−>5,总收入为10+30=40
输入
1 2
5
1 2 5
2 3 10
2 3 8
2 4 6
4 5 6
输出
23
1 2 3
说明
如图所示:
工作时间t为2的条件下,从1出发,可选的线路是: 1,1−>2−>3 注意从1到3有2个要配送的外卖,可以合并配送,时间只算1,所以总收入是5+8+10=23
2,1−>2−>4收入是5+6=11
线路1的收入最大,选择线路1,输出总收入23和线路0 1 3