
用DAG(有向无环图)表示一个工程。顶点表示活动,有向边<Vi,Vj>表示活动Vi活动必须先与Vj活动进行。

所谓的拓扑排序:找到做事的先后顺序







以上根据拓扑排序的实现:
加入对有回路的图进行拓扑排序:

所以原图如果存在回路,就不存在拓扑排序。

采用邻接表进行存储
定义了一个indegree[]数组

定义一个print数组(刚开始全部初始化为-1)

一个空栈S


检查indegree数组当前入度为0的顶点


将与2号结点相连的结点的入度减去1.

接下来我们处理入度为0的还有0号结点。
在while循环里面处理和0号结点相连的几个节点。
接着是1号结点的入度因为减去1之后变成了0。

此时将1号结点也压入栈中

接着把3号结点和4号结点也压入栈中。

下面我们来认识一下逆拓扑排序:
出栈的时候出出度为0

随便删除切番茄和打鸡蛋



我么在删除出度为0的顶点时,还需要删除对应的边,就需要将邻接表全部遍历一遍去寻找其前驱。

所以最好使用邻接矩阵去存储(这样就可以直接去第5列的值)
发现它的前驱是2和3.
也可以采用逆邻接表去存储
我们也可以用DFS算法实现拓扑排序





接下来我们会把4打印输出:

对于3号节点来说,也找不到一个与之相邻且未被访问过的结点。




我们的函数会重新回到上面这个for循环,寻找visited数组为False的顶点。

随意我们发现使用DFS算法,顶点在推出递归栈之前会输出成逆拓扑排序失败




















