我有这样的时间表:
+-----------+-------------+------------+------------+------------+------------+-------+----+
| transport | trainnumber | departcity | arrivecity | departtime | arrivetime | price | id |
+-----------+-------------+------------+------------+------------+------------+-------+----+
| Q | Q00 | BJ | TJ | 13:00:00 | 15:00:00 | 10 | 1 |
| Q | Q01 | BJ | TJ | 18:00:00 | 20:00:00 | 10 | 2 |
| Q | Q02 | TJ | BJ | 16:00:00 | 18:00:00 | 10 | 3 |
| Q | Q03 | TJ | BJ | 21:00:00 | 23:00:00 | 10 | 4 |
| Q | Q04 | HA | DL | 06:00:00 | 11:00:00 | 50 | 5 |
| Q | Q05 | HA | DL | 14:00:00 | 19:00:00 | 50 | 6 |
| Q | Q06 | HA | DL | 18:00:00 | 23:00:00 | 50 | 7 |
| Q | Q07 | DL | HA | 07:00:00 | 12:00:00 | 50 | 8 |
| Q | Q08 | DL | HA | 15:00:00 | 20:00:00 | 50 | 9 |
| ... | ... | ... | ... | ... | ... | ... | ...|
+-----------+-------------+------------+------------+------------+------------+-------+----+
在此表中,共有13个城市和116条路线,最小的时间单位为半小时。 有不同的运输,这无关紧要。正如您所看到的,可能有多个边缘具有相同的离开和到达城市但不同的时间和差价。时间每天都是不变的。
现在,这里出现了一个问题。
用户想知道他如何从A市到B市旅行( A和B可能是一个城市),通过零或一些城市C,D ...(是否应该是按顺序取决于用户是否希望它,即有两个问题),在X小时内,而且成本最低在上述条件下。
在此问题出现之前,我已经解决了另一个更简单的问题。
用户想知道他如何从A市到B市旅行( A和B可能是一个城市),通过零或一些城市C,D ...(是否应该是在上述条件下依次),成本最低。
以下是我如何解决它的问题(以不按顺序为例):
但是,我无法想出第一个问题的有效解决方案,请帮助我,谢谢。
如果有人能解决另一个问题,我将不胜感激:
用户想知道他如何从A市到B市旅行( A和B可能是一个城市),通过零或一些城市C,D ...(是否应该是在上述条件下依次),在最短时间内。
答案 0 :(得分:0)
这是一个非常大的问题,所以我只想草拟一个解决方案。
首先,按如下方式重新构建图表。代替每个顶点代表一个城市,让顶点代表(city, time)
的元组。这是可行的,因为只有13个城市,只有(time_limit - current_time) * 2
个可能的时间段,因为最小的时间单位是半小时。现在根据给定的时间表连接顶点,并将价格作为之前的权重。不要忘记,用户可以在任何城市免费停留任何时间。城市A
的所有节点都是起始节点,城市B
的所有节点都是目标节点。获取所有(B, time)
顶点的最小值,以获得最低成本的解决方案。如果有多个,请选择时间最短的那个。
现在迫使用户按顺序通过某些城市。如果有n
个城市要通过(加上开始和目标城市),则需要n+2
个相同图表的副本作为不同级别。该级别表示您已经通过的列表中有多少个城市。所以你从顶点A
的0级开始。一旦你到达0级C1
,你就会移动到图形1级的顶点C1
(用0权重边连接顶点)。这意味着,当您处于等级k时,您已经将城市C1
传递给Ck
,并且您只能通过C(k+1)
进入下一级别。最后一级城市B
的顶点是您的目标节点。
注意:我说的是相同图表的副本,但这并不完全正确。您无法允许用户在级别C(k+2), ..., B
中触及k
,这会违反所需的订单。
要以任何顺序强制传递城市,需要一种连接级别(并在运行时修改它们)的不同方案。我会留给你的。