如何应用 Dijkstra 算法找到逛购物中心的最佳时间
How to apply Dijkstra algorithm to find the optimal time for visiting shopping centres
我在 HackerRank 上尝试了这个 Synchronous Shopping 问题,但我不知道如何解决它。所以我看了社论,我很困惑。也许我误解了 Dijkstra 的单源最短路径算法是如何工作的。
这取自 editorial:
他说
The shortest distance to the state D(V, B)
denotes the minimum time required
to visit shopping center V
with fish from the mask B
bought.
然后他描述了我们从一种状态转移到另一种状态的两种可能方式,然后他说
When all the minimal times are calculated....
我猜他的意思是,在我们到达节点 N 之后,我们应该考虑所有可能的获取鱼的方法。所有 2^k 种方式。比如,我们考虑
1)当我们到达节点N时,我们只有第一条鱼
2) 我们只有第二条鱼...
3)我们只有第一条鱼和第二条鱼..
等..
但是如果我们运行Dijkstra,它会计算从节点1到节点N的最短路径,但是我们必须走一条特定的路径才能从节点1到节点N。我们只会得到沿这些节点可用的鱼。我们如何计算所有其他状态? (用不同的鱼组到达节点 N)
让我试着帮助你,因为我最近做了这个练习。我将尝试逐步构建解决方案或主要思想。
问题总结:有两只猫,它们从1号开始,一直走到N号,每次都买一组鱼,只有两只猫都买完鱼,它们才能停在N号.两只猫可以走不同的路,重游购物中心。
这道题objective是求出买完所有鱼的最短时间,也就是两只猫到达N,两只猫一起买完所有鱼的最长时间。
现在,让我们尝试构建解决方案:想象一下,你没有鱼,你只想知道一只猫从购物 1 到 N 需要的最短时间。Dijkstra 可以解决这个问题,对吧?它将计算从源(商店 1)到所有其他节点的所有最短时间。
下一步是添加鱼:现在,假设我们只有一只猫,我们必须在每一站都买鱼。尝试想象以下情况:不是您的图形的每个顶点只是购物中心,而是猫到目前为止购买的鱼的购物和组合,存储信息。
这意味着可以多次将购物添加到优先级队列中,这在 "normal" Dijkstra 算法中不会发生。这使您可以计算从源头开始的最短时间以及所有可能的组合,以达到购买鱼类的购物目的。不幸的是,这会将顶点数量增加到 O(N*2^(k-1))。确保为所有顶点存储最短时间,我们将在下一步中使用它。
另一个基本技巧是将鱼保存在位集中而不是列表或向量中,因为购买鱼是 OR 操作。大多数使用的按位运算都是常量 O(1).
最后一步是添加第二个 cat:If 您计算 Dijkstra 如下所述,您将获得所有顶点的所有最短时间,这些顶点是所有购物和购买的鱼的状态。我们只对我们在商店 N 并且猫 1 和猫 2 购买的鱼的组合等于购买的所有鱼的情况感兴趣。
已经考虑到如果一只猫到达N,它必须等待另一只猫到达,这意味着无论一只猫买了什么鱼,如果另一只猫到达,如果其余的,没关系。
从技术上讲,您将处理所有可用于购物 N 的可能场景,如果猫 1 和 2 的鱼的组合等于所有购买的鱼,您将获得最短的时间(所有可能性中的最小值) .
不幸的是,这是一种详尽的方法,但通过得很好。这是Dijkstra处理后的两个for stacked。
我在 HackerRank 上尝试了这个 Synchronous Shopping 问题,但我不知道如何解决它。所以我看了社论,我很困惑。也许我误解了 Dijkstra 的单源最短路径算法是如何工作的。
这取自 editorial:
他说
The shortest distance to the state
D(V, B)
denotes the minimum time required to visit shopping centerV
with fish from the maskB
bought.
然后他描述了我们从一种状态转移到另一种状态的两种可能方式,然后他说
When all the minimal times are calculated....
我猜他的意思是,在我们到达节点 N 之后,我们应该考虑所有可能的获取鱼的方法。所有 2^k 种方式。比如,我们考虑
1)当我们到达节点N时,我们只有第一条鱼
2) 我们只有第二条鱼...
3)我们只有第一条鱼和第二条鱼..
等..
但是如果我们运行Dijkstra,它会计算从节点1到节点N的最短路径,但是我们必须走一条特定的路径才能从节点1到节点N。我们只会得到沿这些节点可用的鱼。我们如何计算所有其他状态? (用不同的鱼组到达节点 N)
让我试着帮助你,因为我最近做了这个练习。我将尝试逐步构建解决方案或主要思想。
问题总结:有两只猫,它们从1号开始,一直走到N号,每次都买一组鱼,只有两只猫都买完鱼,它们才能停在N号.两只猫可以走不同的路,重游购物中心。
这道题objective是求出买完所有鱼的最短时间,也就是两只猫到达N,两只猫一起买完所有鱼的最长时间。
现在,让我们尝试构建解决方案:想象一下,你没有鱼,你只想知道一只猫从购物 1 到 N 需要的最短时间。Dijkstra 可以解决这个问题,对吧?它将计算从源(商店 1)到所有其他节点的所有最短时间。
下一步是添加鱼:现在,假设我们只有一只猫,我们必须在每一站都买鱼。尝试想象以下情况:不是您的图形的每个顶点只是购物中心,而是猫到目前为止购买的鱼的购物和组合,存储信息。
这意味着可以多次将购物添加到优先级队列中,这在 "normal" Dijkstra 算法中不会发生。这使您可以计算从源头开始的最短时间以及所有可能的组合,以达到购买鱼类的购物目的。不幸的是,这会将顶点数量增加到 O(N*2^(k-1))。确保为所有顶点存储最短时间,我们将在下一步中使用它。
另一个基本技巧是将鱼保存在位集中而不是列表或向量中,因为购买鱼是 OR 操作。大多数使用的按位运算都是常量 O(1).
最后一步是添加第二个 cat:If 您计算 Dijkstra 如下所述,您将获得所有顶点的所有最短时间,这些顶点是所有购物和购买的鱼的状态。我们只对我们在商店 N 并且猫 1 和猫 2 购买的鱼的组合等于购买的所有鱼的情况感兴趣。
已经考虑到如果一只猫到达N,它必须等待另一只猫到达,这意味着无论一只猫买了什么鱼,如果另一只猫到达,如果其余的,没关系。
从技术上讲,您将处理所有可用于购物 N 的可能场景,如果猫 1 和 2 的鱼的组合等于所有购买的鱼,您将获得最短的时间(所有可能性中的最小值) . 不幸的是,这是一种详尽的方法,但通过得很好。这是Dijkstra处理后的两个for stacked。