我手里拿着一份清单:
[(1,2),(1,4),(2,4),(3,9),(4,7),(7,9)]
我必须实现一个功能,该功能包括:现有关系列表,一对新现实,距离n。 < / p>
函数应该以这种方式工作:它接受所有参数,计算以新关系给出的节点之间的距离,如果距离<=距离n,则函数返回包含新关系的列表。
例如:
list = [(1,2),(1,4),(2,4),(3,9),(4,7),(7,9)]
new_relation = [(1,3)]
distance_n = 4
它将返回[(1,2),(1,3),(1,4),(2,4),(3,9),(4,7), (7,9)]
如果距离为3,则会返回原始列表
[(1,2),(1,4),(2,4),(3,9),(4,7),(7,9)]
我怎么能这样做?我的图表有问题。 注意:它应该在Haskell中实现。
答案 0 :(得分:1)
与Haskell一样,我们首先声明我们的类型。这里&#39;我只想说Graph
是Edge
的列表,而Edge
是Node
的元组,它们只是Int
1}}š
type Node = Int
type Edge = (Int, Int)
type Graph = [Edge]
然后我们可以宣布我们的功能&#39;类型。首先,我们有一个解决特定问题的函数
addNode :: Graph -> Edge -> Int -> Graph
addNode graph newEdge maxDistance = undefined
但是我们从问题陈述中知道我们需要一个帮助器,即一个计算两个节点之间距离的函数(如果节点没有连接,则可以是未定义的)。由于这并不总是有一个有效的返回值,我们会将其打包在Maybe
中,并在节点未连接时返回Nothing
distance :: Graph -> Node -> Node -> Maybe Int
distance graph fromNode toNode = undefined
有了这个辅助函数,我们现在可以非常简单地实现addNode
addNode graph newEdge@(fromNode, toNode) maxDistance =
case distance graph fromNode toNode of
Nothing -> graph
Just d ->
if d <= maxDistance
then newEdge : graph
else graph
但看起来您希望对图表进行排序,因此如果您导入Data.List
,则只需投放sort
addNode graph newEdge@(fromNode, toNode) maxDistance =
case distance graph fromNode toNode of
Nothing -> graph
Just d ->
if d <= maxDistance
then sort $ newEdge : graph
else graph
现在你所要做的就是实施distance
,你就完成了。
答案 1 :(得分:1)
the containers package和the graphs package都有与您相似的邻接列表表示。
A Very General Method of Computing Shortest Paths包含用于查找图形距离的Djikstra算法的功能实现,但它适用于邻接矩阵。更改表示或更改算法以处理邻接列表。
实际上有一个函数距离:: Graph - &gt;顶点 - &gt;顶点 - &gt;距离和功能addEdge :: Edge - &gt;图 - &gt;图,你是金色的。 addEdge应该相对容易编写而不依赖于表示,但通常添加边缘意味着你必须丢弃任何先前的缓存距离计算。