vis*_*vis 9 algorithm haskell graph shortest-path
我正在使用Martin Erwig的功能图库(FGL)来表示以下简单的有向加权图.
genLNodes :: [LNode String]
genLNodes = zip [1..5] ["A","B","C","D","E"]
genLEdges :: [LEdge Int]
genLEdges = [(1,2,4),(1,3,1),(2,4,2),(3,4,2),(2,5,1),(4,5,1),
(2,1,4),(3,1,1),(4,2,2),(4,3,2),(5,2,1),(5,4,1)]
mygraph :: Gr String Int
mygraph = mkGraph genLNodes genLEdges
Run Code Online (Sandbox Code Playgroud)
现在我想找到一个节点到另一个节点如最短路径A
,以E
使用Dijkstra算法.似乎有一个功能可以做到Data.Graph.Inductive.Query.SP
:
dijkstra :: (Graph gr, Real b) => Heap b (LPath b) -> gr a b -> LRTree b
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何从提供的界面中使用它.任何帮助将非常感激.如果我以正确的方式创建有向加权图,或者是否还有其他(更好)的包,我还想听听其他任何建议吗?
为了获得两个节点之间的最短路径,模块提供了一个特殊的功能,sp
(大概是"最短路径"的缩写),所以获得最短路径的最简单方法是
sp 1 5 mygraph
Run Code Online (Sandbox Code Playgroud)
sp
用途dijkstra
:
spTree :: (Graph gr, Real b) => Node -> gr a b -> LRTree b
spTree v = dijkstra (H.unit 0 (LP [(v,0)]))
sp :: (Graph gr, Real b) => Node -> Node -> gr a b -> Path
sp s t = getLPathNodes t . spTree s
Run Code Online (Sandbox Code Playgroud)
从中您可以看到如何生成生成树并从中获得最短路径,但除非您有充分的理由不使用提供的函数,否则您应该坚持使用.
归档时间: |
|
查看次数: |
943 次 |
最近记录: |