(这可能相当于 Evgeny Kluev 发布的算法,我不明白。如果是这样,则该答案具有优先权。)
令 F_i_j 为到达 j 时油箱中的净有符号燃油量,在 i 处开始,油箱中的燃油为零,然后在 i 处加注。
通过在每个节点处添加燃料并减去每条边的燃料成本来计算每个节点 i 的 F_0_i。
如果 F_0_0(从 0 开始的回路末端的净燃料)为负数,则系统中没有足够的燃料(根据问题陈述,这不应该发生)。
如果没有 F_0_i 为负,则报告 0 作为结果。
否则,找到 F_0_s 负值最大的节点 s。选择 s 作为起始节点。
对于任何节点 i,F_s_i 等于 F_0_i + abs(F_0_s)。由于 F_0_s 是最负的 F_0_i,这使得 F_s_i 非负。
Worked example, as suggested in a comment by Handcraftsman:
Label nodes 0 through 4
node: 0,1,2,3,4
fuel: 1,3,4,4,1
dist: 1,4,2,2,2
First calculate F_0_i for i = 1, 2, 3, 4, 0
Start at node 0 with 0 fuel.
f_0_1 = 0 + 1 - 1 = 0, min score 0, node 1;
f_0_2 = 0 + 3 - 4 = -1, min score -1, node 2;
f_0_3 = -1 + 4 - 2 = 1;
f_0_4 = 1 + 4 - 2 = 3;
f_0_0 = 3 + 1 - 2 = 2;
f_0_0 is non-negative, so there is enough fuel.
The minimum score was -1, at node 2, so the result is node 2.