Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 具有燃料约束的最短路径_Algorithm_Graph Algorithm_Dijkstra_Shortest Path - Fatal编程技术网

Algorithm 具有燃料约束的最短路径

Algorithm 具有燃料约束的最短路径,algorithm,graph-algorithm,dijkstra,shortest-path,Algorithm,Graph Algorithm,Dijkstra,Shortest Path,我在一次比赛中发现了这个问题,至今还没有找到解决办法。我正在考虑应用Dijkstra的或其他什么,但不太清楚: ''给你一个城市的加权连通图,所有边都有正权重。有些城市(节点)有汽油泵,而有些没有。你有一辆油箱容量为C的自行车。也就是说,油箱装满后,汽车可以行驶C个单位的距离。在任何一个有汽油泵的城市,汽车都可以把油箱加满。找出给定源和给定目标之间的最短路径。假设你从满油箱开始 我感觉O(mn logn)会被它接受 基本上,您需要根据自行车到达时剩余的燃料将每个节点n_i拆分为多个节点,我们称之

我在一次比赛中发现了这个问题,至今还没有找到解决办法。我正在考虑应用Dijkstra的或其他什么,但不太清楚:

''给你一个城市的加权连通图,所有边都有正权重。有些城市(节点)有汽油泵,而有些没有。你有一辆油箱容量为C的自行车。也就是说,油箱装满后,汽车可以行驶C个单位的距离。在任何一个有汽油泵的城市,汽车都可以把油箱加满。找出给定源和给定目标之间的最短路径。假设你从满油箱开始


我感觉O(mn logn)会被它接受

基本上,您需要根据自行车到达时剩余的燃料将每个节点n_i拆分为多个节点,我们称之为(n_i,r)。您不需要在开始时创建所有(n_i,r),您可以动态创建

然后类似于Dijkstra,你从节点(n_0,C)开始,每次你可以找到下一个(n_x,r),你可以到达最小的距离。并更新连接到(n_x,r)的所有节点(n_y,ry)。如果n_y有泵,则ry将重置为C。如果对于n_y,已经有一个节点(n_y,r)并且r>=ry,那么您不需要创建新节点(n_y,ry),只需忽略它


我不能说运行时的复杂性,但它应该足以在竞赛中获得AC。

@Tim Green的方法将创建一个指数(加油站数量)节点数。运行Dijkstra将非常缓慢。有一种更快的方法


首先,找出所有加油站之间的距离。还包括从源头到每个加油站、从每个加油站到终点以及从源头到终点的距离。这可以通过多次运行来完成

这将为您提供从开始到结束的所有可能有效路由的图表。只需在这个图上再运行一次Dijktra,就可以得到最终的解决方案


由于Dijkstra's的每次运行将O(V2)(V=城市数量),并且您必须将其运行O(G)次(G=加油站数量,一次Djikstra可以找到从一个加油站到所有其他加油站的距离),因此此算法将在O(V2G)中运行时间。

Dijkstra算法有一个修改,即通过Dijkstra算法的另一个修改按需计算加油站顶点之间的距离,该算法搜索指定范围内所有未解析的加油站顶点

  • 处理开始和结束作为加油站
  • 将启动放入主优先级队列
  • 运行主Dijkstra和次Dijkstra 主Dijkstra在循环中执行以下步骤:
    0当主优先级队列为空且带有“finish unreachable”时退出。
    1.从主优先队列中取加油站。
    2.完成后退出。
    3.致电sub Dijkstra,向未解决的相邻加油站提供距离实际加油站的距离

    sub Dijkstra使用自己的优先级队列(直到队列为空)搜索从实际加油站到燃油范围内所有顶点的最短路径,并根据其状态处理到达的加油站:
    *已在main中解析-不处理输出边。
    *在主队列中等待-更新距离(当距离较低时,然后减小键)和路径

    *否则,将其放入主队列

    数据范围是什么?我刚才看到了这个问题,所以我不太记得范围。当我第一次看到这个问题时,我对O(mn logn)的感觉。请随时提出具有不同时间复杂性的解决方案。我什么都没有非常适用于电动汽车;-)它是自行车还是汽车?(n_0,C)之后应选择哪个节点?我认为您需要在每个节点上存储(DistanceTraveled,n_I,r),并每次选择距离最小的节点。复杂性将是(nodesCapacity的no_)log(nodesCapacity的no_)+1。虽然如果图是稀疏的,但有多个加油站,那么最好用于所有对的最短路径。@PavelGatnar:Whoops,找到所有加油站之间的距离是O(V^2*G)。一旦我考虑到这一点,我的答案仍然和你的答案一样复杂(尽管你的答案在实践中会稍微快一点)。干得好使用这些距离形成一个图形,然后删除所有长度超过C的边。'-可能有很多边,不创建它们怎么样(Dijkstra可以用最大距离修改)?