您正在考虑的算法可以解决问题,但必须正确构建要处理的图表。
您的问题是时机。假设您想在 14:00 之前从 A 到 C 的人,我们共有 4 个航班:
航班 1:A -> B,10:00 -> 11:00,Cap. 100
航班 2:A -> B,11:00 -> 12:00,Cap. 100
航班 3:B -> C,11:30 -> 12:30,Cap. 100
航班 4:B -> C,12:30 -> 13:30,Cap. 100
您可以在这里看到,您可以填满所有航班,并及时从A 到C 得到 200,但构建图表需要考虑时间。
我的建议是你没有一个节点来代表B,而是有几个节点:
(B, 11:00) - B 11:00。
(B, 12:00) - B 12:00。
(B, 12:30) - 3 号航班起飞时。
(B, 13:30) -当 #4 航班起飞时。
任何可以从B 起飞的航班都将被添加到图表一次,从相关的B 节点开始。
B 节点连接到具有无限容量的边缘中的其他B 节点,按时间顺序向前移动。这允许乘客在B 的不同时间之间“等待”。
这个例子最终会得到以下边列表:
// 飞行边缘
[(A, 10:00), (B, 11:00)],章。 100
[(A, 11:00), (B, 12:00)],章。 100
[(B, 11:30), (C, 12:00)],章。 100
[(B, 12:30), (C, 13:00)],章。 100
// 等待边
[(B, 11:00), (B, 11:30)],章。无限
[(B, 11:30), (B, 12:00)],章。无限
[(B, 12:00), (B, 12:30)],章。无限