图——拓扑排序和关键路径算法实现

拓扑排序测试用例

在这里插入图片描述

关键路径测试用例

在这里插入图片描述

源代码

public class TopologicalSort {
   

    int numEdge;   //边的个数
    int numVertex;  //顶点个数
    VertexNode[] vertexNodes; //顶点数组

    int[] etv;//C存放事件(顶点)的最早开始时间(Ealist Time Vertex)
    int[] ltv;//C存放事件的最晚开始时间(Latest Time Vertex)

    Stack<Integer> s = new Stack();//存放拓扑排序的结果,起点在栈底,终点在栈顶,用来计算事件的最晚开始事件



    /**
     *    建立拓扑图
     * @param numV 图的顶点个数
     * @param numE  图的边个数
     * @param listEdge  存储边的指向,由前一个指向后一个
     * @param listVertex 存储顶点的值
     */
    public void creatTopo(int numV,int numE,List<Integer> listVertex,List<Integer> listEdge){
   
        this.numVertex = numV;
        this.numEdge = numE;
        vertexNodes = new VertexNode[numV];
        etv = new int[numV];

        /*假设顶点 下标的值 和 顶点的值 相同*/
        for(int i=0;i<numV;++i){
   
            vertexNodes[i] = new VertexNode();
            vertexNodes[i].data = listVertex.get(i);
            vertexNodes[i].in =0; //所有顶点的入度初始化为0
        }

        for(int i=0;i<listEdge.size();i+=3){
   
            int v1 = listEdge.get(i); //弧尾顶点
            int v2 = listEdge.get(i+1);//弧头顶点
            int w = listEdge.get(i+2);//有向边的权重

            vertexNodes[v2].in += 1; //弧的指向弧头 入度 加一

            TopoEdge e = new TopoEdge();
            e.adjvex = v2;
            e.weight=w;
            /*插入弧尾顶点的邻接点链表*/
            e.next = vertexNodes[v1].firstEdge;
            vertexNodes[v1].firstEdge = e;

        }
    }
    /**
     *  AOV网(Active on Vertex NetWork):无权有向图(无环),顶点表示活动,弧表示活动之间的优先关系
     * 拓扑排序:对有向图构造拓扑序列的过程
     *
     * 算法思想: 1、首先保存初始图的入度为0的顶点
     *          2、将入度为0的顶点访问执行后后,更新这些顶点所在边对应顶点的入度
     *          3、再将这些入度为0的顶点保存后重复 步骤2
     *          注意:如果执行完后访问的顶点数<全部顶点,说明图中存在环
     *
     *  结果:输出此图的拓扑排序
     */
    public void Topo(){
   

        /*将初始图 入度为0 的顶点存入队列(存的是顶点在顶点列表的下标)*/
        Queue<Integer> q = new LinkedList<>();
        for(int i=0;i<numVertex;++i){
   
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值