自己动手写数据结构(9)——图的拓扑排序和关键路径

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

自己动手写数据结构总目录

具体内容:

该文章的源代码仓库为: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MeteorChenBo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值