Haskell - 通过声明的图形类型查找路径

时间:2018-04-26 20:00:20

标签: haskell

type Node = Integer
type Edge = (Integer, Integer)
type Graph = [Edge]
type Path = [Node]

g :: Graph
g = [(1,2), (1,3), (2,3), (2,4), (3,4)]
h :: Graph
h = [(1,2), (1,3), (2,1), (3,2), (4,4)]

对于作业,我们正在使用上面定义的类型,并且必须实现一些功能。目前我正在尝试编写一个名为paths的函数,它将返回所有可能无循环路径的列表。例如,如果我调用paths 1 4 g,则输出将为=> [[1,2,3,4], [1,2,4], [1,3,4]]

我有一个已经编写的函数用于返回给定节点的相邻节点。

adjacent :: Node -> Graph -> [Node]
adjacent n gr = [ y | (x, y) <- gr, x == n]

我无法入门。我相信我需要使用相邻节点来获取每个相邻节点,然后使用相邻节点到那些节点,直到我完成目标节点。只是想知道我是否在正确的轨道或一些有用的指导,谢谢!

编辑所以只想发布更新。一直在寻找并找到一种方法来构建起始节点的所有路径列表...

allPaths :: Node -> Graph -> [Path]
allPaths startNode graph = map (startNode:) (go startNode)
  where
    go curNode =
      case [ snd node | node <- graph, fst node == curNode ] of
        [] -> [[]]
        nextNodes -> [ nextNode : path | nextNode <- nextNodes, path <- go nextNode ]

在最终节点中添加时,是否有办法只返回到达此终端节点的路径?

0 个答案:

没有答案