首页 > 其他分享 >图 - 拓扑排序 & 关键路径

图 - 拓扑排序 & 关键路径

时间:2023-11-21 15:44:17浏览次数:36  
标签:入度 拓扑 路径 AOV 顶点 排序

图 - 拓扑排序 & 关键路径

拓扑排序

AOV网

  1. DAG图:有向无环图
  2. AOV(Activities On Vertex Network)网:用顶点表示活动,用弧表示活动间的优先关系的网.AOV网中不会出现自环(有向环),这意味着有的活动以他自己为前提。

拓扑排序

按照优先顺序对AOV网中的顶点进行排序 使之形成一个线性序列。

算法步骤

  1. 选择一个无前驱结点并输出;
  2. 删除这个结点和所有以其为尾的弧;
  3. 重复上述两步直至不存在无前驱结点。此时如果已输出的顶点数小于图中顶点数,说明图中存在自环,否则输出的顶点序列就是一个拓扑序列。

辅助数据结构

  1. 一维数组indegree[i]
    删除顶点及以其为尾的弧时,不用调整图的存储结构,只需要将弧头结点的入度减1.
  2. s
    暂存所有入度为0的顶点,避免重复扫描。
  3. 一维数组topo[i]
    记录拓扑序列的顶点序号。

算法实现

void TopologicalSort(ALGraph G, int topo[]) {
    FindInDegree(G, indegree); // 求各顶点初始化入度
    for(int i = 0; i < G.vexnum; i++)
        if(!indegree[i]) s.push(i); // 暂存入度为0的
    int cnt = 0; // 记录输出的顶点个数
    while(!s.isEmpty()) {
        s.pop(); topo[cnt] = i; cnt++;
        p = G.vertices[i].firstarc; // 第一条依附该结点的边 指向第一个邻接点
        while(p != NULL) {
            k = p->adjvex; indegree[k]--; // 每个邻接点入度减1
            if(!indegree[k]) s.push(k);
            p = p->agjvex; // 指向下一条边
        }
    }
}

算法分析

求各顶点入度:O(e) + 建立零入度顶点栈O(n) = O(n + e)

关键路径

AOV网

  1. AOV(Activity On Edge)网,用边表示活动,顶点表示事件,权值表示活动持续时间的带权有向无环图。
  2. 一些定义
  • 源点:(唯一的)入度为0的点
  • 汇点:(唯一的)出度为0的点
  • 带权路径长度:一条路上的权值和
  • 关键路径:长度最长的路径(可能不只一条)
  • 关键活动:关键路径上的活动,对整个工程时间影响最大

求解过程

  1. 对顶点进行排序,用拓扑排序算法求出每个事件的最早发生时间;
  2. 逆拓扑排序求出每个事件的最迟发生时间;
  3. 求每个活动的最早开始时间和最晚开始时间;
  4. 最早开始时间等于最晚开始时间的活动就是关键活动。

算法分析

时间复杂度为O(n + e)

标签:入度,拓扑,路径,AOV,顶点,排序
From: https://www.cnblogs.com/ww0809/p/17846571.html

相关文章

  • 快速排序与归并排序模版
    快速排序voidquick_sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[l+(r-l>>1)];while(i<j){doi++;while(q[i]<x);doj--;while(q[j]>x);if(i&l......
  • 选择排序以及 TopN 问题
    选择排序选择排序是把最大或最小的元素放到最边上,然后不断重复以上过程。堆排序也是如此,只不过堆排序通过构建数据结构,让查找最大或最小元素并放到最边上的速度比选择排序快得多。选择排序实现voidSelectSort(std::vector<int>&data,intlen){if(len==0){......
  • 今天复习了一遍快速排序
    #include<iostream>usingnamespacestd;#include<stdio.h>constintN=10e6+10;intn;intq[N];voidquick_sort(intq[],intl,intr){if(l>=r)return;intx=q[l];inti=l-1;intj=r+1;while(i<......
  • 归并排序知识总结
    归并排序思维导图:知识点:如果原序列中两个数的值是相同的,它们在排完序后,它们的位置不发生变化,那么这个排序是稳定的。快速排序是不稳定的,归并排序是稳定的。快排变成稳定的=>使快排排序数组中的每个数都不同,将ai变成<ai,i>这个二元组,将ai的下标也放进来,使用双关键字排序。快速......
  • JAVA冒泡排序
    //冒泡排序publicclassDemo05{publicstaticvoidmain(String[]args){int[]arr={4,1,5,2,3};for(inti=0;i<arr.length-1;i++){//外循环:控制比较轮数(数组长度-1)i:0,1,2,3for(intj=0;j<arr.length-1......
  • 集成 NVDC 电源路径管理的1-4节电池升降压充电IC解决方案
    描述MP2760是一款集成窄电压DC(NVDC)电源路径管理功能和USBOn-the-Go(OTG)功能的升降压充电IC,兼容USBPD,适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广,可支持最高22V。当启用电池放电模式(Sourcemode)时,芯片的IN引脚可提供高达21V的电压。当提供电源输入时,MP2760通......
  • List 函数排序操作,用对方法事半功倍!
    作为一名程序员,以下这些场景你肯定不陌生,1.数据分析和处理:在处理大量数据时,需要对数据进行排序以进行进一步的分析和处理。例如,在市场调研中,可能需要按照客户的购买频率对客户列表进行排序,以确定哪些客户最有可能购买产品或服务。2.报表生成:在生成报表时,往往需要按照特定的顺序对......
  • C++U3-第1课-基础排序(一)
    学习目标排序的概念  本阶段会学习的排序有 冒泡排序概念 第一轮比较,与交换 例题1:一趟交换 例题2:多躺比较,冒泡排序 【题意分析】进行n-1趟冒泡排序的过程,每一次输出当前一趟冒泡排序完的结果【思路分析】定义一个n,输入当前的n和储存n个数的数组for......
  • Java学习—计数排序
    计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。1.计数排序的特征当输入的元素是n个0到k之间的整数时,它的运行时间是Θ(n+k)。计数排序不是比较排序,排序的速度快于任......
  • Redis主从有几种常见的拓扑结构?
    Redis的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性可以分为以下三种:一主一从、一主多从、树状主从结构。1.一主一从结构一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持。2.一主多从结构一主多从结构(又称为星形拓扑结构)使得应用端可......