我想通过具有给定出发点和目的地的图来获取所有可能路径列表的列表。 该图给出如下: 通过图获取路径列表
data Node = N1 | N2 | N3 | N4 | N5 deriving (Show, Eq)
neighbor :: Node -> [Node]
neighbor N1 = [N2, N4, N5]
neighbor N2 = [N1, N3]
neighbor N3 = [N1, N4, N5]
neighbor N4 = [N5]
neighbor N5 = [N1]
的问题是:给定一个起始节点和目的地节点(例如启动节点= N1和目的地= N4)所有可能的路由,而无需循环,从开始导致目的地应该是结果。在给出的例子将是:
[[N1, N2, N3, N4],[N1, N4]]
功能我想用是解决这个问题:
generatePaths :: (Node -> [Node]) -> Node -> Node -> [[Node]]
这里的第一个参数应为邻居功能,第二起始节点和第三个目的地节点。
我的主要问题是,我现在找到如何遍历所有邻居,并呼吁每个邻居作为新的开始节点generatePaths
。
任何帮助,高度赞赏
编辑: THX到克罗姆和路跑我想出了一个实现。
dfs_h :: (Node -> [Node]) -> [Node] -> [Node] -> Node -> [[Node]]
dfs_h graph visited [] _ = [visited]
dfs_h graph visited (n:ns) end
| elem n visited = (dfs_h graph visited ns end)
| elem end ns = [reverse (end:visited)] ++ (dfs_h graph visited (n:[neigh|neigh <- ns, neigh /= end]) end)
| n == end = [reverse (end:visited)] ++ (dfs_h graph visited ns end)
| otherwise = dfs_h graph (n:visited) ((graph n) ++ ns) end
dfs start end = filter (\x -> elem end x) (dfs_h neighbor [start] (neighbor start) end
我知道这不是最美的解决方案,只是我想出的第一个。
EDIT2: 但是这个算法的一个问题是,当图如下所示:
neighbor :: Node -> [Node]
neighbor N1 = [N2, N3]
neighbor N2 = [N5]
neighbor N3 = [N4]
neighbor N4 = [N2, N1]
neighbor N5 = [N1]
和N1
到N4
的路径将被找到,那么函数的结果是
[[N1, N2, N5, N3, N4]]
现在我不知道如何实施,以便N2
和N5
(不应该是解决方案的一部分)不包含在内。 任何建议?
你尝试过这么远吗? – melpomene
不幸的是,我不能给你一个错误的实现,因为我删除它从头开始。但我的方法是这样的帮助函数: 'generatePaths_h ::(Node→Node [节点]) - > [Node] - > [Node] - > Node - > Node - > [[Node]]' where第二个参数现在是通向当前节点的路径,第二个参数应该是仍然需要迭代的邻居列表。其余参数与'generatePaths'相同 – user3079799
该图是否定向?你试图解决这个问题的算法是什么? – Krom