使用列表和集在haskell中创建有向非循环图

时间:2014-01-27 10:07:50

标签: haskell graph directed-acyclic-graphs

我想在haskell中创建一个DAG,但由于我是整个函数式编程的新手,我想要一些指示。

图表需要仅使用列表和集合构建,并且必须实现以下功能:

v = add_vertex(g,w)

将具有指定权重w的顶点添加到DAG g,并返回其唯一的顶点标识符v。

的add_edge(G,A,B,W)

从具有顶点标识符a的顶点到具有顶点标识符b的顶点的边缘被添加到具有权重w的DAG g中。

到目前为止我所做的是创建一个如下所示的数据类型:

data Graph v w = Graph {vertices :: [(v, w)],
edges :: [([(v, w)], [(v, w)], w)]} deriving Show

我想我需要某种形式的图形构造函数,它看起来像这样:

create_graph :: (v,w) -> w -> Graph v w 
create_graph v w  = Graph [v] [(v, v, w)]

我想要做的只是创建一个空图,但现在我需要输入一些起始值,如果我理解正确的话。我该如何解决这个问题?

add_vertex函数如下所示:

add_vertex :: Graph v w -> (v, w) -> Graph v w
add_vertex (Graph v w) x = Graph (v ++ [x]) w

但我真的不知道如何返回顶点标识符而不是整个图形。我想我还应该指定标识符需要是一个char,权重可以是浮点数或整数,我在哪里这样做?

我还想拥有拓扑排序功能并获得最长路径的权重。考虑到这一点,我应该以不同的方式定义图形的结构吗?

谢谢

1 个答案:

答案 0 :(得分:1)

我要做的是像树一样定义图形

data Graph a = Graph [(a,[a])] -- Graph is a list of origins paired with edgeends

createGraph ::Eq a => [(a,a)] -> Graph a
createGraph = undefined

empty :: Graph a
empty = Graph []

insertVertex :: Eq a => a -> Graph a -> Graph a
insertVertex = undefined -- insert if not already in the Graph (with empty edges)

insertEdge :: Eq a => (a,a) -> Graph a -> Graph a
insertEdge = undefined -- insert edge in list of origin
--do not forget to add origin, end if they don't exist

实现这些并稍后担心bfs / topsort并考虑bfs的结果 - 你想要什么结果? (topsort的结果应该是我猜的列表。)