这是我的代码:
module Main where
import Data.Graph.Inductive
import Data.Graph.Inductive.Example
func :: Graph gr=> gr a b ->[Node]->Int-> [(Node,Int)]
func graph (x:xs) y
|indeg graph x == 0 = (x,y+1):func (delNode x graph ) xs (y+1)
graph2:: Gr Int Int
graph2 = mkGraph (genLNodes 1 14)[(1,2,1),
(1,3,1),
(3,14,1),
(14,6,1),
(14,7,1),
(2,4,1),
(2,5,1),
(4,6,1),
(5,7,1),
(6,8,1),
(7,9,1),
(8,10,1),
(9,11,1),
(10,12,1),
(11,12,1),
(12,13,1),
(14,13,1)]
Graph2有14个节点,例如(1,2,1)表示从节点1到节点2的边,权重为1.
Func采用我的Graph2,拓扑排序顶点和一些数字,例如0。 Func检查节点的向内度是否等于0并创建元组列表,其中x是IdNode,当indeg graph x == 0为真时y增加。顶点被删除
这是我的问题,我想看看更多顶点的度数是否为0并加1。
编辑:
该功能应如下:
topsort:[1,3,14,2,5,7,9,11,4,6,8,10,12,13]
答案 0 :(得分:2)
通过延迟评估,您可以使用“tie-the-knot”方法以声明方式计算深度:
minOr0 [] = 0
minOr0 ds = minimum ds
depths :: Graph gr => gr a b -> [(Node, Int)]
depths gr =
let pairs = [ (x, depth x) | x <- nodes gr ]
depth x = 1 + minOr0 [ d | y <- pre gr x, let Just d = lookup y pairs ]
in pairs
test2 = depths graph2
pairs
和depth
之间的定义是循环的:评估pairs
次调用depth
中的元组。致电depth
会在pairs
中查找其他元组。如果图形没有任何循环,则该过程最终将完成
终止。
由于懒惰评估在Haskell中的工作方式,对depth
的调用
被有效地记忆。