[英]Haskell - generating all paths between nodes
我需要构建一个函数,它返回某些节点之间的所有路径。
connect :: Int -> Int-> [[(Int,Int)]]
Data.Graph库为我提供了有用的函数'buildG',它为我构建了图形。 如果我打电话
let g = buildG (1,5) [(1,2),(2,3),(3,4),(4,5),(2,5)]
,
我将得到一个数组,其中每个节点都映射到他的邻居。 一个例子:
g!1 = [2]
g!2 = [3,5]
..
g!5 = []
我试图使用列表推导来做到这一点,但我在haskell中并不是很好,而且我输入的错误是我无法修复的。
connect x y g
| x == y = []
| otherwise = [(x,z) | z <- (g!x), connect z y g]
关于周期,我现在不需要担心。 这是我想要的:
connect 1 5 g = [[(1,2),(2,3),(3,4),(4,5)],[(1,2),(2,5)]]
递归思考。 从s
到e
路径由s
一个边(s,t)
和从t
到e
的路径组成,除非s == e
,在这种情况下路径应为空。 所以第一次尝试是
connect x y g
| x == y = [[]]
| otherwise = [(x,t):path | t <- g!x, path <- connect t y g]
从节点到自身的所有合格路径的列表是具有单个元素[]
的列表,在其他情况下,我们通过上面的逻辑获得所有符合条件的路径的列表,选择第一个边缘并从其末尾找到路径。
问题是循环会导致它挂起。 为避免这种情况,您必须记住您已访问过的节点,而不是从中探索的路径:
connect x y g = helper x y g [x]
where
helper a b g visited
| a == b = [[]]
| otherwise = [(a,c):path | c <- g!a, c `notElem` visited, path <- helper c b g (c:visited)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.