拓扑排序
首先理解几个概念,出度和入度
- 出度:在图中,从某结点出发的箭头的个数叫做某结点的出度
- 入度:在图中,指向某结点的箭头的个数叫做某结点的入度
原理介绍
拓扑排序就是基于出度和入度的概念来完成的,每一次输出一个入度为0的结点。如下图的图,我们需要完成课表的排序。使每门课都在修完预修课程之后排出。
伪代码
//拓扑排序
#void Topsor()
{
for (cnt = 0; cnt < | V | ; cnt++)//|V|图中的结点个数
{
输出(V = 未输入的入度为0的顶点);
if (这样的V不存在)
{
Error("图中有回路");
break;
}
输出V.或记录V的输出序号;
for (V的每个邻接点W)
Indegree[W]--;
}
}
对于输出入度为零的结点v,如果采取的全部遍历的做法,那么整体复杂度就是O(n的平方)
聪明的做法
//拓扑排序
#void Topsor()
{
for (图中的每个顶点)
{
if (Indegree[V] == 0)
Enqueue(V, Q);
}
while (!IsEmpty(Q))
{
V = Dequeue(Q);
输出V,或者记录V的输出编号; cnt++
for (V的每个邻接点W)
if (--Indegree == 0)
Enqueue(W, Q);
}
if (cnt !=结点个数)
Error("图中有回路")
}
拓扑排序应用–关键路径问题
- AOV网络,每一个顶点表示一个事件,一个活动
- AOE网络
每条边表示一道工序,一般用于表示项目的工序,边表示工序,结点表示工序到此结束。以一个工程为利,每个工程都有多道工序,在AOE网络中把每个结点都分为三部分:持续时间,机动时间,顶点编号(工序编号)
关键路径就是绝对不允许延误的活动组成的路径。