算法构造domaintree


 

1,D{n} 的求解

求一个一个流图的所有节点的支配节点的算法 输入:一个流图G,G的节点集合是{N},边的集合是{E} 输出:对于N中的每个节点n,给出D{n},即所有支配节点n的节点集合D{n} 方法: 对于N中所有节点 D{n} = OUT[n]     图1 算法运行过程 D{1} = {1} D{2} = {2} U D{1} = {1,2} D{3} = {3} U {D{1} ∩ D{2} ∩D{4} ∩D{8} } = {3} U {{1} ∩ {1,2} ∩{1-N} ∩D{1-N} = {1,3} D{4} = {1,3,4} D{5} = {1,3,4,5} D{6} = {1,3,4,6} D{7} = {1,3,4,7} D{8} = {1,3,4,7,8} D{9} = {1,3,4,7,8,9} D{10} = {1,3,4,7,8,10}

2,深度优先排序

对一个流图G的深度优先遍历。 从入口节点开始,并首先访问离入口节点最远的节点,一个深度优先过程过程中的搜索路径形成一个深度优先树{Depth-First-Spanning-Tree} 如图1右侧,实线边构成了一个深度优先生成树。虚线边是流图中的其他边。 这个树的深度优先遍历是1-3-4-6-7-8-10,回退到8,在访问9,回到8,回到7-6-4,前进到5,从5回到4,回到3-1,最后从1前进到2   深度优先排序: 对一个流图G,他的生成树是T,那么对T的后序遍历的反序列就是一个流图G的一个深度优先排序。 对于图1的深度生成树 前序遍历 1 3 4 6 7 8 10 9 5 2 后续遍历 10 9 8 7 6 5 4 3 2 1 深度优先排序 1 2 3 4 5 6 7 8 9 10   深度优先生成树和深度优先排序 输入:一个流图G 输出:G的一个深度优先树T和一个深度优先排序 方法:我们用递归过程search(n),该算法先将G中所有节点初始化为unvisited,然后调用search(n0),其中n0是入口节点,当它调用search(n),首先将n设置为visited,未免将n再次加入树中,使用一个c作为计数器,G的节点总数,一个倒计数到1,在算法执行的时候,把c的值赋给节点n的深度优先编号dfn[n],边的集合T形成了G的深度优先生成树。 Search (n) {   将n设置为visited for(n的所有后继s){ if(s标记为unvistied){ 将边n->s 加入T中; search(s) } dfn[n] = c; c = c - 1; } main(){ T = {}//空集 for(G的所有节点n) 把n标记为unvisted c = G 的节点个数 search() }     深度生成树中的边 1,前进边 从生成树节点到达后代节点的边 。 2,后退边 从生成树到达其祖先的边。 3,交叉边,两个节点不存在父子关系。不互为祖先。