这个问题可以重新构造成一个最短路径问题。我们将每个馅饼视为一个节点,如果 Bessie 可以在收到馅饼 A 后将馅饼 B 送给 Elsie(或者同样地 Elsie 送给 Bessie),则存在从节点 A 到节点 B 的有向边。在这种表述下,我们有 2N 个“起始节点”,必须确定对于每个这样的节点,到达有效“结束节点”的最短路径。
显然,我们不能简单地使用全对最短路径算法来解决这个问题,因为这种算法对于 N≤105 来说太慢了。然而,我们可以利用所有路径的权重都为 1 的事实,从多个源节点开始使用 BFS 进行搜索。这可以通过在算法开始时将所有源节点添加到队列中来简单实现。
通常情况下,这个算法需要 O(N) 时间,但我们还需要高效地找到对于给定的 k,那些具有口感值在 k 和 k+D 之间的节点集合。在将 Bessie 和 Elsie 的馅饼列表按照它们的美味程度排序后,可以使用二分搜索来完成这一点。这使得我们的总运行时间为 O(NlgN),这仍然足够快以获得完整的分数。