如何在Haskell中遍历图?

时间:2019-02-11 04:03:15

标签: haskell graph

假设我有以下图形:

(graph, nodeFromVertex, vertexFromKey) = graphFromEdges [("a", 'a', ['b']), ("b", 'b', ['c']), ("c", 'c', []), ("d", 'd', ['b'])]

这是视觉效果:

enter image description here

我想要一种方法来找出没有出线边的顶点。

在这种情况下,只有c

我认为找到它的方法是手动递归,直到找到没有连接的顶点。但是我不确定如何在这里递归...

Haskell图形文档并没有真正说出...

2 个答案:

答案 0 :(得分:2)

GraphArray Vertex [Vertex]。您可以使用Vertex(基于0的{​​{1}}索引)对其进行索引,然后获取后继顶点的列表。您可以获取没有像这样的后继者的顶点列表(假设已导入Int

Data.Array

此列表推导选择带有空后继列表的元素的索引。

可以使用vs = [v | (v, []) <- Data.Array.assocs graph] 函数将顶点映射到节点。

答案 1 :(得分:2)

您可以使用outdegree来获得所有顶点的输出边数的数组:

Prelude Data.Graph Data.Array> outdegree graph
array (0,3) [(0,1),(1,1),(2,0),(3,1)]

数组中每个元素的值是输出边的数量。如果要过滤数组,可以将其变成关联列表:

Prelude Data.Graph Data.Array> assocs $ outdegree graph
[(0,1),(1,1),(2,0),(3,1)]

,然后对其进行过滤。由于您对没有传出边的顶点感兴趣,因此可以筛选关联列表中的值(第二个元素)为0的那些点:

Prelude Data.Graph Data.Array> filter ((0 ==) . snd) $ assocs $ outdegree graph
[(2,0)]

如果需要节点列表,则可以使用nodeFromVertex映射该过滤的关联列表:

Prelude Data.Graph Data.Array> l = filter ((0 ==) . snd) $ assocs $ outdegree graph
Prelude Data.Graph Data.Array> fmap (nodeFromVertex . fst) l
[("c",'c',"")]