从零开始学数据结构系列之第四章《拓扑排序之AOV网》

ops/2024/9/24 14:21:26/

文章目录

  • AOV网
    • AOV网的特点
    • AOV网的图解
  • 往期回顾


AOV网

​    在一个表示工程的有向图中,用顶点表示活动,用表示活动之间的优先关系。这样的有向图为顶点表示活动的网,我们称为AOV网

AOV网的特点

(1)AOV网中的弧表示活动之间存在的某种制约关系。

(2)AOV网中不能出现回路。

1.若是从i到j有一条有向路径,则i是j的前驱,j是i的后继
2、若<i,j> 是网中有向边,则i是j的直接前驱,j是i的直接后继
3、AOV网中不允许有回路,因为如果有回路存在,则表明某项活动以自己为先决条件,显然不可能

AOV网的图解

简单来说, 如下图所示
在这里插入图片描述
  这就相当于表示活动以及优先关系,读小学之后(后继)就是中学, 读中学前必须是要读小学(前驱)。 你总不能读完中学读小学把(倒反天罡是吧),后面也是同样的道理

同时也可以用下图表示
在这里插入图片描述
实现方法

  • 从AOV网中选择一个没有前驱的顶点(入度为0)并输出。
  • 从网中删除该顶点和所有以它为起点的有向边。
  • 重复①和②直到当前的AOV网为空或者当前网中不存在无前驱的顶点为止。后一种情况说明拓扑排序失败,该
  • 向图就不是一个AOV网,该有向网中存在环。
  • 使用一个栈(或队列或线性表),只要能保存入度为0的顶点就行,进行这些顶点活动的顺序不重要,这体现了拓扑排序序列可能具有多个的特点。

☁️ 以上就是所有内容,对大家有用的话点个关注!感谢大家!

往期回顾

1.【第一章】《线性表与顺序表》
2.【第一章】《单链表》
3.【第一章】《单链表的介绍》
4.【第一章】《单链表的基本操作》
5.【第一章】《单链表循环》
6.【第一章】《双链表》
7.【第一章】《双链表循环》
8.【第二章】《栈》
9.【第二章】《队》
10.【第二章】《字符串暴力匹配》
11.【第二章】《字符串kmp匹配》
12.【第三章】《树的基础概念》
13.【第三章】《二叉树的存储结构》
14.【第三章】《二叉树链式结构及实现1》
15.【第三章】《二叉树链式结构及实现2》
16.【第三章】《二叉树链式结构及实现3》
17.【第三章】《二叉树链式结构及实现4》
18.【第三章】《二叉树链式结构及实现5》
19.【第三章】《中序线索二叉树理论部分》
20.【第三章】《中序线索二叉树代码初始化及创树》
21.【第三章】《中序线索二叉树线索化及总代码》
22【第三章】《先序线索二叉树理论及线索化》
23【第三章】《先序线索二叉树查找及总代码》
24【第三章】《后续线索二叉树线索化理论》
25【第三章】《后续线索二叉树总代码部分》
26【第三章】《二叉排序树基础了解》
27【第三章】《二叉排序树代码部分》
28【第三章】《二叉排序树代码部分》
29【第三章】《平衡二叉树基础概念》
30【第三章】《平衡二叉树的平衡因子》
31【第三章】《平衡二叉树的旋转基础详解》
32【第三章】《平衡二叉树的旋转类型图文详解》
33【第三章】《平衡二叉树的旋转类型总结及总代码》
34【第三章】《哈夫曼树简单了解》
35【第三章】《哈夫曼树的构造方法》
36【第三章】《哈夫曼编码构造及代码》
37【第四章】《图的定义》
38【第四章】《图的基本概念和术语》
39【第四章】《图的存储结构》
40【第四章】《图的遍历之深度优先遍历》
41【第四章】《广度优先遍历BFS》
42【第四章】《图的遍历总代码》
43【第四章】《最小生成树概念》
44【第四章】《最小生成树的应用举例》
45【第四章】《prim算法(普里姆算法)详解》
46【第四章】《prim算法(普里姆算法)详解2》
47【第四章】《prim算法(普里姆算法)详解3》
48【第四章】《prim算法(普里姆算法)讲解汇总》
49【第四章】《prim算法(普里姆算法)代码讲解》
50【第四章】《prim算法(普里姆算法)总代码》
51【第四章】《克鲁斯卡尔算法思路介绍》
52【第四章】《克鲁斯卡尔算法步骤思路1》
53【第四章】《克鲁斯卡尔算法步骤思路2》
54【第四章】《克鲁斯卡尔算法应用场景-公交站问题》
55【第四章】《克鲁斯卡尔算法判断回路问题》
56【第四章】《克鲁斯卡尔算法步骤回顾》
57【第四章】《克鲁斯卡尔算法代码初始化详解》
58【第四章】《克鲁斯卡尔算法总代码详解》
59【第四章】《了解最短路径》
60【第四章】《迪杰斯特拉算法了解》
61【第四章】《Dijkstra 迪杰斯特拉算法图解》
62【第四章】《Dijkstra 迪杰斯特拉算法总代码》
63【第四章】《弗洛伊德(floyd)算法简介》
64【第四章】《弗洛伊德算法详解》
65【第四章】《弗洛伊德代码详解》


http://www.ppmy.cn/ops/94140.html

相关文章

Vue 3 中的观察者效果:从 watch 到 watchEffect、watchSyncEffect 和 watchPostEffect

目录 watch 函数 watchEffect 函数 watchSyncEffect 函数 watchPostEffect 函数 watchEffect 与 watch 的差异 watchSyncEffect 的特定用例 watchPostEffect 的优势 使用场景对比 Vue.js 是一个广受欢迎的前端框架,以其直观的数据绑定和组件化架构著称。Vue 3…

线程状态

线程状态 在操作系统层面&#xff0c;线程共有五种状态&#xff1a; 初始状态&#xff1a;仅是在语言层面创建了线程对象&#xff0c;还未与操作系统线程关联 可运行状态&#xff08;就绪状态&#xff09;&#xff1a;指该线程已经被创建&#xff08;与操作系统线程关联&…

HTTP请求的流转路径,从Tomcat到SpringMVC

本文主要讲一下&#xff0c;一个HTTP请求在后端服务的流转路径&#xff0c;Tomcat等一众servlet容器如何定义了Web应用的基础样貌&#xff0c;后来的MVC框架又是如何弱化了servlet的存在&#xff0c;改为自己实现请求派发的。 前些日子我写了十几篇文章来介绍Tomcat的架构&…

2766:最大子矩阵

网址如下&#xff1a; OpenJudge - 2766:最大子矩阵 用dp来做就行了 代码如下&#xff08;MLE&#xff09;&#xff1a; #include<cstdio>const int maxn 101; int dp[maxn][maxn][maxn][maxn]; int martix[maxn][maxn]; int N, ans;int main(void) {scanf("%d&q…

测试需求分析(四)

本章内容概要 什么是软件测试需求软件测试需求的必要性如何对软件测试需求进行分析&#xff08;重要&#xff09; 1. 软件测试需求 测试需求主要解决"测什么"的问题&#xff0c;一般来自需求规格说明书中原始需求 产品文档 — 产品收集整理 — 市场调研/甲方客户 …

爬虫 Web Js 逆向:常用的混淆、编码、加密介绍

爬虫 Web Js 逆向&#xff1a;常用的混淆、编码、加密介绍 注&#xff1a;代码混淆本质是对代码标识符和结果的调整&#xff0c;从而达到不可读不可调试的目的。 注&#xff1a;参数加密方法有的可解密&#xff0c;有的不可解密。 1. eval 混淆 eval 是浏览器 v8 引擎定义的…

前端(HTML + CSS)小兔鲜儿项目(仿)

前言 这是一个简单的商城网站&#xff0c;代码部分为HTML CSS 和少量JS代码 项目总览 一、头部区域 头部的 购物车 和 手机 用的是 文字图标&#xff0c;所以效果可以和文字一样 购物车右上角用的是绝对定位 logo用的是 h1 标签&#xff0c;用来提高网站搜索排名 二、banne…

设计模式 - 组合模式

💝💝💝首先,欢迎各位来到我的博客!本文深入理解设计模式原理、应用技巧、强调实战操作,提供代码示例和解决方案,适合有一定编程基础并希望提升设计能力的开发者,帮助读者快速掌握并灵活运用设计模式。 💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定…