具体内容:
该文章的源代码仓库为:https://github.com/MeteorCh/DataStructure/blob/master/Java/DataStructure/src/Graph/AdjListGraph.java
一、拓扑排序
1.定义
- AOV网: 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,成为AOV(Activity On Vertex Network)网。
- 拓扑序列 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。
以下面的图为例:

按照拓扑排序的定义,V1必须要在V0的后面,V2必须要在V0、V1的后面,V3必须要在V1、V2的后面,V4必须要在V2、V3的后面。那这个图的拓扑排序只有一种,就是V0,V1,V2,V3,V4。对于一个图,拓扑排序可能不唯一,而且,只有有向无环图才存在拓扑排序(如果有环,比如上面的图中,V3和V1之间的边改成V3指向V1,那按照拓扑排序的定义,V3必须在V2的后面,V2必须在V1的后面,那V3就必须在V1的后面,又因为V3->V1有边,那V1必须在V3的后面,这就矛盾了)。
2.拓扑排序算法
如何实现拓扑排序呢?具体步骤如下:
- 1.首先找到图中入度为0的节点,输出
- 2.将与该节点相连的以该点为起点的弧全部删除(该弧的终点所相连的顶点的入度减1),重复上面的步骤,指导所有节点均输出
- 3.如果图中的节点没有完全输出,说明图中存在环,不存在拓扑排序。
3.代码实现
我在以前实现的邻接表存储的图(博客在这里,源码在这里)来实现拓扑排序,我这里只写函数,具体的图的具体Java代码如下:
首先是拓扑排序的实现代码,函数参数earlistStartTime是在求解关键路径时,记录事件的最早开始时间的,在这个函数里有关earlistStartTime的代码暂时先不用管。
/**
* 拓扑排序
* @param earlistStartTime 事件的最早开始时间
* @return 拓扑排序结果
*/
protected LinkedList<Integer> topoSort(int[] earlistStartTime) throws Exception {
int[] in=new int[vertexNum];//统计每个节点的入度的数组
boolean[] visitFlag=new boolean[vertexNum];//标记节点是否已输出
//初始化
if (earlistStartTime!=null){
for (int i=0;i<vertexNum;i++)
earlistStartTime[i]=0;
}
for (int i=0;i<vertexNum;i++){
visitFlag[i]=false;
VertexNode node=vertexes[i];
ArcNode arcNode=node.firstArc;
while (arcNode!=null){
in[arcNode.nodeIndex]++;
arcNode=ar

本文深入讲解图的拓扑排序和关键路径算法,包括定义、算法原理及Java代码实现,通过实例展示如何求解有向无环图的拓扑排序和AOE网的关键路径。
最低0.47元/天 解锁文章
478

被折叠的 条评论
为什么被折叠?



