我想在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,权重可以是浮点数或整数,我在哪里这样做?
我还想拥有拓扑排序功能并获得最长路径的权重。考虑到这一点,我应该以不同的方式定义图形的结构吗?
谢谢
答案 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的结果应该是我猜的列表。)