algorithm - Scala - 两个节点之间的最短路径递归算法

标签 algorithm scala graph dijkstra shortest-path

我正在 Scala 中递归地实现 Dijkstra 的最短路径算法,但我遇到了一些麻烦。我得到的节点 32 的输出不正确,调用方式如下,shortestPath(3, 2, x, BitSet.empty)。这输出 6,但正确答案应该是 7。我似乎无法弄清楚我的代码有什么问题。

var x = ListBuffer(ListBuffer(0, 2, 3, 4), 
                   ListBuffer(2, 0, 0, 0), 
                   ListBuffer(3, 0, 0, 0), 
                   ListBuffer(4, 0, 0, 0))

我的代码如下所示。

def shortestPath(cur: Int, dest: Int, graph: ListBuffer[ListBuffer[Int]], visited: BitSet) :Int = {
    val newVisited = visited + cur
    if(cur == dest) 0
    else {
      var pathLength = for(i <- graph(cur).indices; if(!visited(i) && graph(cur)(i) > 0)) yield {
          graph(cur)(i) + shortestPath(i, dest, graph, newVisited)
        }
      if (pathLength.isEmpty) 0 else pathLength.min
      }
    }

最佳答案

正如 obourgain 指出的那样,代码的关键错误在于当两个节点未连接时将最小距离解释为 0。

如果两个节点断开连接,它们之间的最小距离应该是无穷,这是因为两个断开连接的节点的成本必须大于任何连接节点的成本,一个简单的修复您的代码是用 Int.MaxValue 来识别无穷大。

def shortestPath(cur: Int, dest: Int, graph: ListBuffer[ListBuffer[Int]], visited: BitSet) :Int = {
    val newVisited = visited + cur
    if(cur == dest) 0
    else {
        var pathLength = for(i <- graph(cur).indices; if(!visited(i) && graph(cur)(i) > 0)) yield {
            val sLen = shortestPath(i, dest, graph, newVisited)
            if (graph(cur)(i) > Int.MaxValue - sLen) Int.MaxValue else graph(cur)(i) + sLen // change #1
        }
        if (pathLength.isEmpty) Int.MaxValue else pathLength.min // change #2
    }
}

此修改将在调用 shortestPath(3, 2, x, new BitSet()) 时给出预期的答案 Int = 7

注释为“change #1”的代码是为了在邻居节点无法到达目标节点时防止整数溢出(因此最小距离为Int.MaxValue),代码注释为“更改#2”的是在断开连接时将两个节点之间的最小距离视为“无限”。

关于algorithm - Scala - 两个节点之间的最短路径递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40622358/

相关文章:

javascript - 你如何改进这个算法来找到不在数组中的最小正整数

mysql - 验证 Web 套接字中的 url 参数握手 - 玩 scala

python - 我如何使用 Matplotlib 可视化连接矩阵?

algorithm - 字符串中的第一个非重复字符?在 haskell 或 F# 中

生成随机网络的算法

algorithm - 查找有向图中的所有根

Scala TraversableOnce 和 toSet

scala - 令人惊讶的Scala迭代器 "out of memory"错误

java - 存储无向图的最有效方法是什么?

python - 在 Python 中绘制两个正弦曲线的总和