一个问题通常会涉及多个环节,但是,环节之间是有特殊关系,有些活动在别的活动做完才能继续执行,比如,在刷题的环节时,你必须先我完成一个环节的任务,后面的环节都会有先前的要求。
这样的过程我们叫做有向无环图:
拓扑排序
基本思想:将有向无环图去掉它的约束。
找出一个满足有向无环图的满足关系的节点排列(点不受后面的约束)
以施工的流程图为例,有些活动(子工程)必须要先执行,有些活动需要在其他活动之后才可以执行。为了形象地反映出整个工程中各个活动之间的先后关系,可用一个有向图来表示,图中的顶点代表活动,图中的有向边代表活动的先后关系,即有向边的起点是终点的前序,只有当起点活动完成之后,其终点活动才能进行。
算法流程
-
把所有入度为0的点记录下来(不受约束)。
-
对于记录下来的点,去掉入读为-1的点(约束),如果某个点入读将为0,也将其记录下来。
-
反复执行上面的操作,直到记录没有这个点时(此时为一个拓排序)。
循环结束,若输出的顶点数小于图中的顶点数,则表示该图中存在回路,也就是无法进行拓扑排序;否则输出的顶点序列