在 Go 中回溯以查找有向无环图中的所有路径,将路径分配给解决方案切片的问题(Leetcode 797)

Posted

技术标签:

【中文标题】在 Go 中回溯以查找有向无环图中的所有路径,将路径分配给解决方案切片的问题(Leetcode 797)【英文标题】:Backtracking in Go to find all paths in Directed Acyclic Graph, problem assigning paths to a solution slice (Leetcode 797) 【发布时间】:2021-02-13 18:43:54 【问题描述】:

我在 Go 中尝试 Leetcode 747。问题总结:

给定一个有 n 个节点的有向无环图 (DAG),标记为 0 到 n - 1、找到从节点0到节点n-1的所有可能路径,并返回 以任何顺序。

给出的图如下:graph[i] 是你能找到的所有节点的列表 从节点 i 访问(即存在从节点 i 到节点的有向边 图[i][j])。

这是我目前的解决方案:

func allPathsSourceTarget(graph [][]int) [][]int 
    allSolutions := [][]int
    target := len(graph) - 1

    isSolution := func(current int) bool 
        return current == target
    

    processSolution := func(solution []int) 
        allSolutions = append(allSolutions, solution)
    

    var backtrack func(currentPath []int)

    backtrack = func(a []int) 
        currentNode := a[len(a)-1]
        if isSolution(currentNode) 
            processSolution(a)
         else 
            candidates := graph[currentNode]
            for _, c := range candidates 
                a = append(a, c)
                backtrack(a)
                a = a[:len(a)-1]
            
        
    

    backtrack([]int0)

    return allSolutions

它通过了 7/30 个输入,但随后在这个 [[4,3,1],[3,2,4],[3],[4],[]] 上失败了。预期的输出是[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

我认为问题在于我如何将每个结果附加到 allSolutions 切片。如果我记录每次出现的解决方案,这就是预期的结果,但它似乎会改变已经添加的解决方案。

如果我将日志添加到allSolutions func,对于上述输入,这是输出:

Solution:
[0 4]
New allSolutions:
[[0 4]]
Solution:
[0 3 4]
New allSolutions:
[[0 3] [0 3 4]]
Solution:
[0 1 3 4]
New allSolutions:
[[0 1] [0 3 4] [0 1 3 4]]
Solution:
[0 1 2 3 4]
New allSolutions:
[[0 1] [0 3 4] [0 1 2 3] [0 1 2 3 4]]
Solution:
[0 1 4]
New allSolutions:
[[0 1] [0 3 4] [0 1 4 3] [0 1 2 3 4] [0 1 4]]

我很想知道为什么会这样。是否与从更高范围修改变量有关?

【问题讨论】:

【参考方案1】:

processSolution 应该复制它的参数。否则,backtrack 会继续改变它传入的切片,从而导致您看到的损坏。

【讨论】:

太好了,谢谢!我使用了copy 函数,解决了我的问题。

以上是关于在 Go 中回溯以查找有向无环图中的所有路径,将路径分配给解决方案切片的问题(Leetcode 797)的主要内容,如果未能解决你的问题,请参考以下文章

使用 BFS/DFS 寻找有向无环图中权重最大的路径

在有向无环图中求最长路径

有向无环图中的最小路径覆盖

正加权有向无环图中的k-边最短路径

有向无环图的判定及拓扑排序

算法:有向无环图的最短路径