算法导论第三版 22.4 拓扑排序 课后题答案全解析

22.4 拓扑排序:如果包含边(u,v)则u的拓扑排序在v的前边

拓扑排序的算法:

TOPOLOGICAL_SORT(G)

调用DFS计算每个结点v的结束时间v.f(就是设置为黑色时候的时间)

在每个结束时间计算出来的时候加入到链表的前部

返回链表

 

1. p n o s m x r y v w z u q t 按照深度优先搜索给出的f从大到小排序

 

2. 线性时间内求两个结点之间简单路径的数量。

 

运用递归算法:

Sim_Path(u,v){
  if (u==v) return 1;
  else if (u.paths!= NIL)
       return u.paths;
       else
       for(each w belong to Adj[u])
         u.paths = u.paths +    Sim_Path(w,v);
}

(感觉不出这个题目和拓扑排序的关系)因为无环也不会重复计算某条边,时间复杂度为O(V+E),符合线性时间复杂度。

 

3. 给出一个算法判断无向图是否包含环路。重要在于时间复杂度在O(V)数量级且与E无关。

 

在这无向图中进行深度优先搜索,如果存在一条边(uv),v的颜色不为白色,则存在后向边,存在环,判断出存在环路,算法终止。

这样时间复杂度在OV)数量级,因为如果存在环的话,就会终止,即已经搜索的边少于或者等于已经搜索的点。在最差的情况下,搜索了整个图没有找到环,这个情况下会搜索出深度优先森林。而森林中|E|<|V|,因此OV+E2V,从而复杂度为O(V)

 

4. 证明或反证下列论断:如果有向图G包含环路,则在算法TOPOLOGICAL-SORTG)所生成的结点序列里,图G中与所生成序列不一致的“坏”的边数最少。

 

这个论断是不正确的,可以举出一个反例:


5. 采用找到入度为0的点,删除它并且输出它,这种方法找到拓扑排序,给出在OV+E)时间内完成的思想,然后说当存在环时会发生什么?

 

首先我们需要找到所有结点的入度,运用DFS,时间复杂度为OV+E,然后每次删除结点后更新结点的度数,删除一共V个结点复杂度为OV,更新节点一共E条边需要更新OE,总时间为O2V+E))也就是OV+E)时间复杂度。

如果存在环路,那么将无法删除任何节点,举一个两个节点的环例子,会发现开始不存在入度为0的节点。


你可能感兴趣的:(Introduction,to,Algorithms,algorithms)