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,交叉边,两个节点不存在父子关系。不互为祖先。