背景:您将地图存储为无向图。边缘是街道或高速公路。有两种边 - 绿色和红色 - 两种边都有重量。边的权重是边表示的距离。红色边缘代表收费公路,如果你越过红色边缘,你需要支付与边缘重量一样多的美分。例如,红色边缘(r,20)长20英里,花费20美分。所有的绿色边缘都是免费的。
问题:编写算法以查找从城市S到城市D的最便宜/最短路径。成本优先于距离。例如,500英里长的免费路径比300英里长的路径要好70美分!
如果所有边缘都是绿色的话,问题就是最短的路径问题。此外,如果存在从S到V的连接路径,并且所有红色边缘都被移除,则它是最短路径问题。如果S和V没有连接所有红色边缘,该怎么办?然后可能插入最便宜的红色边缘,如果S和V连接它,那么问题再次成为最短路径问题。所以现在我发现了三个简单的案例: 1.所有绿色图表。 2.当连接所有红色边缘时,具有从S到V的路径的图形。 3.当连接最便宜的红色边缘时,具有从S到V的路径的图形。 在这一点之后它会变得有点困难,或者是吗???答案 0 :(得分:2)
成本优先于距离。例如,500英里长的免费路径比300英里长的路径要好70美分!
运行Djikstra's algorithm using a min-priority queue,其中探索的路线优先排序,首先是最低成本,其次是最低距离。
由于全绿色路线将具有零成本,因此将首先探索这些路线以寻找最短距离路线;如果没有零成本路线,那么,只有这样,才能按照最低成本的优先顺序探索红色路线。
答案 1 :(得分:0)
只需运行"稍加修改" Dijkstra在此图表上设置每个边缘的重量与其价格。您可以找到所有低成本解决方案,然后选择最短的解决方案。
唯一真正的问题是,您可以使用成本为0的边缘,但可以解决 - 如果您处于可以打开多个节点的情况下(它们的价格相同),请选择距离最短的节点
与经典Dijkstra的唯一区别。
在每个步骤的dijkstra中,您以最低的成本打开节点。如果有多个节点成本最低,您只需选择其中任何一个(这无关紧要)。
在这种情况下,如果您有多个成本最低的节点,则选择距离最小的节点。如果有多个节点具有最低成本和最低距离,您可以打开它们中的任何一个(这没关系)。
这解决了你提到的每一个案例。
答案 2 :(得分:0)
问题更多的是关于如何处理数据而不是算法。让我提出这个问题。假设所有路径的长度之和小于1&000; 000' 000。然后我可以将成本和长度编码为成本* 1&000; 000' +长度。现在,您有一个简单的图表,其中只有一个要优化的指标。
我认为很清楚,搜索要优化的最重要的事情是成本(因为我们将它乘以1&#39,000&#39,000)而对于成本相等的路径,长度是将成为决定因素。
要实际执行此操作,您不需要我刚刚做过的假设或转换。您可以在任何地方保持成本和长度,只需修改您的比较,首先比较成本,并且只有在比较长度时才能进行比较。