Algorithm 到达目的地的最短天数|图

Algorithm 到达目的地的最短天数|图,algorithm,graph,Algorithm,Graph,给定一个图,其中每个节点代表一个城市。一些城市通过双向道路相互连接。还给出了每条道路的长度。有些城市有旅馆。给定出发城市和目的城市,以及表示一个人在一天内可以行驶的最大距离的值K,找出该人能够到达目的地的最小天数(或者告诉他对于给定的K是否不可能)。 (注意:如果一天内行驶的距离超过K,此人可以在有酒店的城市休息,如果该城市没有酒店,这意味着您必须选择另一条路径。第二天,此人可以从该城市出发,行驶的距离重置为0)。这可以通过Dijkstra完成: 假设我们的dijkstra状态是{daysPa

给定一个图,其中每个节点代表一个城市。一些城市通过双向道路相互连接。还给出了每条道路的长度。有些城市有旅馆。给定出发城市和目的城市,以及表示一个人在一天内可以行驶的最大距离的值K,找出该人能够到达目的地的最小天数(或者告诉他对于给定的K是否不可能)。
(注意:如果一天内行驶的距离超过K,此人可以在有酒店的城市休息,如果该城市没有酒店,这意味着您必须选择另一条路径。第二天,此人可以从该城市出发,行驶的距离重置为0)。

这可以通过Dijkstra完成:

  • 假设我们的dijkstra状态是
    {daysPassed,timetraveled,vertexId}
  • 初始状态为
    {0,0,startCity}
    我们将其添加到优先级队列(按元组排序,最小优先)
  • 对于队列中的每个状态:

  • 试着去所有邻近的城市(如果
    TimeTraveled+Edgewighth,这是Dijkstra,有一个转折点,也就是说,可能的终点由那里的酒店确定。你试过什么?@LajosArpad这些“转折点”往往会完全改变问题。举个“转折点”为例最短路径问题,你需要经过一组节点。这很快变成NP-hard(旅行商问题)。我不是说这里是这种情况(否则会是一个答案),但是“扭曲”是不平凡的。具体来说,考虑k=2,你有3个节点<代码> A、B、C < /代码>(所有的酒店),边为:
    w(a,b)=2,w(b,c)=2,w(a,c)=3
    。直接从
    a
    移动到
    c
    是Dijkstra算法返回的最短路径,但这不是一个可行的解决方案。OP:你能分享一下这个问题的一些局限性吗?预计会有多少个城市?有多少家酒店?
    K
    的预期值是多少?@amit如果我的立场是这个问题是t他与“给我一个Dijkstra”一模一样,那么我会这么说。然而,问题中没有证据表明有人试图构造一个算法,因此我指出Dijkstra是一个思考过程的潜在起点,但不是解决方案。如果有人做不到这一点,这是完全可以理解的,但没有人会得到我的帮助y发布这类问题。至少应该证明一些努力。“如果一天内旅行的距离超过K”:这令人困惑,因为这似乎表明一个人可以在一天内旅行超过K,但在完成后必须休息。我想这应该是“如果一天的计划旅行超过K”,旅行者应该在超过K之前休息?这对我来说并不是“感觉”最好的(不是说这是事实,只是我的直觉)。您能否提供一个解释或草图来证明其工作原理?TimeTraveled是行驶的总距离?或者它在每次查找下一个相邻节点时都被设置为零,因为您正在与maxTravelTimePerDay进行比较(根据问题,这是k)?@bucky,
    TimeTraveled
    是一天内行驶的距离。您可以看到它在第五个项目符号中被重置(元组中的中间值)。