【问题标题】:Priority queue and deque优先队列和双端队列
【发布时间】:2016-01-19 13:36:48
【问题描述】:

我正在做这个问题http://www.spoj.com/problems/SHOP/。这个问题归结为计算加权图中 2 点之间的最短路径,其中顶点具有权重。我使用 bfs https://code.hackerearth.com/ff00c2Z 实现了一个工作解决方案,它在示例测试用例上运行良好但是当我用谷歌搜索一些解决方案时,给出了 WA 的结论 我看到实际的解决方案使用了dijkstra。当我试图找出我的错误时,我看到我使用了双端队列而不是优先级队列,在这种情况下它有什么区别?为什么双端队列不起作用?我的方法错了吗?那么如何使用 BFS 来解决这个问题呢?

【问题讨论】:

  • 嗨动画。最好将链接中的重要信息包含在您的问题本身中,因为链接稍后可能会失效。
  • 需要注意的是,由于边没有权重,而是顶点有权重,因此我们可以使用修改后的 BFS 代替 Dijkstra 算法,因为边的权重为 1。跨度>
  • 我做了同样的事情,但似乎我犯了一个我无法找到的错误

标签: algorithm priority-queue deque


【解决方案1】:

您使用的是deque 而不是priority queue,您在问什么问题? 首先在dequeue 中,您没有根据距离对这里的事情进行优先级排序。第一个入队对象或最后一个入队对象始终具有最高优先级,但可能是中间元素应具有最高优先级(它可能成为最高优先级对象)这就是您获得 WA 的原因。


注意:我刚才已经说明了使用dijkstra 的前提条件。您也可以使用BFSDijkstra 来解决此问题。

注意2:需要时使用数据结构。 BFS 中不需要 deque,只需使用队列就足够了,否则处理大型代码会变得更加复杂。

  1. BFS Using Queue in C++ STL

【讨论】:

  • 我们如何知道被存储元素的优先级?
  • 在使用 dijkstra 的情况下,您总是优先考虑与源距离最短的那些。这是 Dijkstra 中的优先属性。
  • 我明白了,但是 BFS 怎么会给出错误的 ans 虽然可以使用 BFS 中的双端队列计算最短路径
  • 在 BFS 中使用队列(为什么队列足够时要使用 deque?)。如果给定的图是加权的,则 BFS 不起作用。这是因为可能存在“更长”路径(就路径中涉及的顶点/边的数量而言),但总权重小于 BFS 找到的“更短”路径。
  • 我明白了,我错了,这是否意味着这个问题不能使用修改后的 bfs 来解决
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2018-07-02
  • 2010-12-28
相关资源
最近更新 更多