拓扑排序
一、实际生活中的问题 在日常生活中,一项大的工程可以看作是由若干个子工程组成的集合,这些子工程之间必定存在一些先后关系,即某些子工程必须在其它一些子工程完成之后才能开始。 我们可以用有向图来表示这些子工程之间的先后关系:子工程为顶点,子工程之间的先后关系为有向边,这种有向图称为“顶点活动网络”,又称“AOV 网”。一个AOV 网应该是一个有向无环图( Directed Acyclic Graph,DAG ),否则必定会有一些活动互相牵制,造成环中的活动都无法进行。 二、WHAT IS 拓扑排序 在AOV 网中,所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面。 对一个DAG G = (V, E) 进行拓扑排序,是将G 中所有顶点排成一个线性序列,使得图中任意一对顶点u 和v,若边u —> v ∈ E,则u 在线性序列中出现在v 之前。 由某个集合上的一个偏序得到该集合上的一个全序,这个操作称为拓扑排序。所得的线性序列,称为拓扑序。 三、算法流程 1. 在有向图中选一个没有前驱的顶点并且输出; 2. 从图中删除该顶点和所有它指出的有向边; 3. 重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的。因此,也可以通过拓扑排序来判断一个图是否有环。 四、例题与代码实现 模板题1 比赛