假设我有以下图形:
(graph, nodeFromVertex, vertexFromKey) = graphFromEdges [("a", 'a', ['b']), ("b", 'b', ['c']), ("c", 'c', []), ("d", 'd', ['b'])]
这是视觉效果:
我想要一种方法来找出没有出线边的顶点。
在这种情况下,只有c
我认为找到它的方法是手动递归,直到找到没有连接的顶点。但是我不确定如何在这里递归...
Haskell图形文档并没有真正说出...
答案 0 :(得分:2)
Graph
是Array 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',"")]