Algorithm 如何在至少通过一次特定节点的条件下找到最便宜的遍历路径

Algorithm 如何在至少通过一次特定节点的条件下找到最便宜的遍历路径,algorithm,graph,graph-theory,dijkstra,Algorithm,Graph,Graph Theory,Dijkstra,我有一个问题,听起来像这样: 你在一个危险的森林里。你走的每一条路在每次使用时都有一定的风险。(具有计算边的无方向图)。你的任务是从宝藏洞的入口进入,然后从出口逃走(在与入口不同的地方) 为此,我假设我需要使用Dijkstra算法来寻找从A(起点)到B,然后从B(终点)到C(出口)的最便宜路径 第二个问题是我不知道怎么做 考虑同样的问题,但是有5颗宝石散布在森林的十字路口(节点),并且有一只致命的狼在睡觉,如果你在杀死他之前收集宝石,他会杀死你。在离开森林之前,你必须收集所有5个 我不知道如何将

我有一个问题,听起来像这样:

  • 你在一个危险的森林里。你走的每一条路在每次使用时都有一定的风险。(具有计算边的无方向图)。你的任务是从宝藏洞的入口进入,然后从出口逃走(在与入口不同的地方)
  • 为此,我假设我需要使用Dijkstra算法来寻找从A(起点)到B,然后从B(终点)到C(出口)的最便宜路径

    第二个问题是我不知道怎么做

  • 考虑同样的问题,但是有5颗宝石散布在森林的十字路口(节点),并且有一只致命的狼在睡觉,如果你在杀死他之前收集宝石,他会杀死你。在离开森林之前,你必须收集所有5个
  • 我不知道如何将Dijkstra算法应用于此。我知道我首先必须应用Dijsktra的算法到达wolf的节点,同时假装节点上有宝石并且它们的边不存在,但是我不确定什么是通向B然后C的最便宜的路径,同时收集所有可能在更昂贵路径上的宝石

    虽然我可以运行5个Dijsktra实例,以获得每个gem的最便宜路径。。我意识到可能会有这样一种情况,两条最便宜的路径加在一起,最终可能不仅仅是走一条更短、更昂贵的路径去获取它们

    示例(忽略箭头):

    如果gem_1驻留在节点2,gem_2驻留在节点1,我会首先找到到gem_1的最便宜的路径,然后再找到gem_2,这将比在gem_1之前访问gem_2更昂贵


    我是否必须对访问节点的所有顺序进行排列,并针对要收集的每个不同的gem顺序迭代运行Dijsktra?还是有更好的办法?还有什么我应该注意的吗?

    让我们忽略wolf这个事实,因为您知道如何处理它,并重新制定问题,以便更加关注:您有一个包含源和目标的图形,并且必须访问其他五个节点(称为gems)

    因此,首先要做的是从源和gems运行SSSP算法(比如Dijkstra),这样,源、每个gem和目标之间的距离就最小了


    通过这种方式,您可以看到一个新的完全连接的图形,其中源、目标和gem是节点,先前计算的距离是边的权重。在该图中,您必须使用起始节点和结束节点来探索每个节点。我认为这是旅行推销员问题的一个特殊版本,但您只有7个节点,因此您可以尝试所有可能性

    我将进行以下建模:

  • 按照@Marco Zamboni的建议,首先找到狼,同时认为宝石的所有边缘都不存在
  • 做一个Dijkstra(开始节点:wolf,结束节点:exit),同时忽略所有要退出的边,只要您没有收集所有宝石

  • 如果你能提供一张测试图表就好了。

    这是在线评委的练习吗?你能发布链接以便我们验证我们的答案吗?问题实例的大小有哪些限制?这是一个问题,但遗憾的是它是私有的,需要登录,我无法提供。这也是问题的编辑版本,只描述了问题的重要部分。这听起来很正确。你的意思是通过运行Dijkstra的算法找到所有节点之间的最短路径,并允许各个实例“在中间相遇”,然后尝试各种可能的排列,看看哪个顺序访问它们最便宜?@JackAvante是的,我正是这么说的