拓扑排序
在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。
首先找到一个入点为0的顶点,然后分离出此顶点,并且删除以此为顶点的弧,然后把这个节点指向的节点的入度减一。
一直做改操作,直到所有的节点都被分离出来。
如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。
下面是算法的演示过程。
练习:实现如下的AOE拓扑排序与关键路径
代码实现
利用栈存储入度为0 的顶点,之后进行顶点分离,直到所有顶点都出栈,开启新的一轮入栈(查找入度为0 的顶点)操作,直到没有入度为0 的顶点,使用count 记录入栈的顶点个数,最后判断是否等于所有顶点数,不相等则证明有循环,不能拓扑排序
-
数据结构
-
实现代码
关键路径
核心思想
- 至少满足拓扑排序。
- 利用最早发生时间数组etv和最晚发生时间数组ltv实现夹逼定理,确定关键路径。
至少满足拓扑排序。
拓扑排序过程中,计算每个顶点的最早发生时间。
所有有前置顶点都完成才能开始,更大的值为最早发生时间。 计算顶点最晚发生时间。
所有顶点都等于最后一个顶点的最早发生时间(因为这个时间是结束时间最大)。
倒序遍历(拓扑排序时,用栈存储,可直接出栈)。
后面的最晚发生时间减去边的权值和前面的时间进行比较。
最晚发生时间可以提前当然更好,所以取更小的值。
利用最早发生时间数组etv和最晚发生时间数组ltv实现夹逼定理,没有额外时间的都是关键活动。
只看路径的话实现比较简单,两个数组中值相等,说明没有多余时间,进行输出。 如果需要输出权值,前一个顶点的最早发生时间加上边的权值后,若等于后一个顶点的最晚发生时间,说明中间没有多余时间,则是关键路径,进行输出。