数据算法与结构-图的拓扑排序与关键路径

350 阅读2分钟

拓扑排序

在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。

首先找到一个入点为0的顶点,然后分离出此顶点,并且删除以此为顶点的弧,然后把这个节点指向的节点的入度减一。

一直做改操作,直到所有的节点都被分离出来。

如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。

下面是算法的演示过程。

练习:实现如下的AOE拓扑排序与关键路径

代码实现

利用栈存储入度为0 的顶点,之后进行顶点分离,直到所有顶点都出栈,开启新的一轮入栈(查找入度为0 的顶点)操作,直到没有入度为0 的顶点,使用count 记录入栈的顶点个数,最后判断是否等于所有顶点数,不相等则证明有循环,不能拓扑排序

  • 数据结构

  • 实现代码

关键路径

核心思想

  1. 至少满足拓扑排序。
  2. 利用最早发生时间数组etv和最晚发生时间数组ltv实现夹逼定理,确定关键路径。

至少满足拓扑排序。

拓扑排序过程中,计算每个顶点的最早发生时间。

所有有前置顶点都完成才能开始,更大的值为最早发生时间。 计算顶点最晚发生时间。

所有顶点都等于最后一个顶点的最早发生时间(因为这个时间是结束时间最大)。

倒序遍历(拓扑排序时,用栈存储,可直接出栈)。

后面的最晚发生时间减去边的权值和前面的时间进行比较。

最晚发生时间可以提前当然更好,所以取更小的值。

利用最早发生时间数组etv和最晚发生时间数组ltv实现夹逼定理,没有额外时间的都是关键活动。

只看路径的话实现比较简单,两个数组中值相等,说明没有多余时间,进行输出。 如果需要输出权值,前一个顶点的最早发生时间加上边的权值后,若等于后一个顶点的最晚发生时间,说明中间没有多余时间,则是关键路径,进行输出。