【数据结构】AOV网与拓扑排序

一.AOV网的概念(Activity On Vertex Network)

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

AOV网的特点:

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

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

二.拓扑排序的定义

拓扑序列:

设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列$v_1,v_2,...,v_n$称为一个拓扑序列,当且仅当满足下列条件:若从顶点$v_i$$v_j$有一条路径,则在顶点序列中顶点$v_i$必在$v_j$之前。

拓扑排序:

对一个有向图构造拓扑序列的过程

拓扑排序是对给定的AOV网判断网中是否存在环的一种算法,若网中所有顶点都在它的拓扑有序序列中,则该AOV网中必定不存在环。

三.拓扑排序的基本思想

(1)从AOV网中选择一个没有前驱的顶点并且输出;

(2)从AOV网中删除该顶点,并且删去所有以该顶点为头的的弧;

(3)重复上述两步,直到全部顶点都被输出,或AOV网中不存在没有前驱的顶点。

四.拓扑排序实现需要的数据结构

1.图的存储结构:

邻接表存储,在顶点表中增加一个入度域in

2.栈S:

存储所有无前驱的顶点

五.拓扑排序的伪代码

1.栈S初始化,累加器count初始化;

2.扫描顶点表,将没有前驱的顶点压栈;

3.当栈非空时循环:

        3.1 $v_j$ 保存弹栈元素,输出$v_j$ ,累加器加一;

        3.2 将顶点$v_j$ 的各个邻接点的入度减一;

        3.3 将新的入度为0的顶点入栈;

4.如果count<vertexNum,则图中有回路

六.代码实现

#include <iostream>
#include <stack>
#include <string.h>
using namespace std;struct node{int number;struct node *next;
};struct vertex{int in;//入度char vertex;struct node *firstedge;
};class ALGraph{
private:int vertexNum,arcNum;struct vertex *v;
public:ALGraph(int n,int e);~ALGraph();void topology();void display();
};int main(int argc, const char * argv[]) {ALGraph G(7, 10);//G.display();G.topology();return 0;
}ALGraph::ALGraph(int n,int e){int p,q;struct node *s;vertexNum=n;arcNum=e;v=new struct vertex[n];for(int i=0;i<n;i++){v[i].firstedge=NULL;v[i].in=0;v[i].vertex=i+'a';}for(int i=0;i<e;i++){cin>>p>>q;s=new struct node;s->number=q;s->next=v[p].firstedge;v[p].firstedge=s;v[q].in++;}}
ALGraph::~ALGraph(){struct node *p,*q;for(int i=0;i<vertexNum;i++){p=v[i].firstedge;while(p){q=p->next;delete p;p=q;}v[i].firstedge=NULL;}delete [] v;
}void ALGraph::topology(){stack <struct vertex> s;int count=0,i,j;struct vertex vj;for(i=0;i<vertexNum;i++){if(v[i].in==0){s.push(v[i]);}}while(!s.empty()){vj=s.top();s.pop();cout<<vj.vertex<<endl;count++;struct node *p=vj.firstedge;while(p){j=p->number;v[j].in--;if(v[j].in==0){s.push(v[j]);}p=p->next;}}if(count!=vertexNum){cout<<"该图中有回路!!!"<<endl;}
}void ALGraph::display(){struct node *p;int i;for(int i=0;i<vertexNum;i++){p=v[i].firstedge;while(p){cout<<v[i].vertex<<"->";char c=p->number+'a';cout<<c<<endl;p=p->next;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scikit-learn线性回归法进行利润预测

大家好&#xff0c;生成式人工智能无疑是一个改变游戏规则的技术&#xff0c;但对于大多数商业问题来说&#xff0c;回归和分类等传统的机器学习模型仍然是首选。 私募股权或风险投资这样的投资者利用机器学习&#xff0c;首先必须了解关注的数据以及它是如何被使用的。投资公…

k8s安装学习环境

目录 环境准备 配置hosts 关闭防火墙 关闭交换分区 调整swappiness参数 关闭setlinux Ipv4转发 时钟同步 安装Docker 配置Yum源 安装 配置 启动 日志 安装k8s 配置Yum源 Master节点 安装 初始化 配置kubectl 部署CNI网络插件 Node节点 检查 环境准备 准…

同步代码,异步代码-微任务 宏任务 事件循环(输出题)

1.知识点 事件循环&#xff1a; 由浏览器Web API管理的异步代码&#xff0c;如果有结果后&#xff0c;会根据这个异步代码的类型&#xff0c;被放入对应的微任务或宏任务当中。当执行栈的任务&#xff08;同步代码&#xff09;全部执行完毕后&#xff0c;再执行完所有微任务的…

Flutter 控件查阅清单

为了方便记录和使用Flutter中的各种控件&#xff0c;特写此博客以记之&#xff0c;好记性不如烂笔头嘛&#xff1a;&#xff09; 通过控件的首字母进行查找&#xff0c;本文会持续更新 控件目录 AAppBar BCContainerColumn &#xff08;列&#xff09; DDivider (分割线) EElev…

oj赛氪练习题,

区间内的真素数 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int M scanner.nextInt();int N scanner.nextInt();scanner.close();ArrayList<Integer>…

吴恩达《机器学习》11-1-11-2:首先要做什么、误差分析

一、首先要做什么 选择特征向量的关键决策 以垃圾邮件分类器算法为例&#xff0c;首先需要决定如何选择和表达特征向量 &#x1d465;。视频提到的一个示例是构建一个由 100 个最常出现在垃圾邮件中的词构成的列表&#xff0c;根据这些词是否在邮件中出现来创建特征向量&…

Docker下安装可视化工具Portainer

目录 Portainer简介 Portainer安装 Portainer简介 Portainer是一款开源的容器管理平台&#xff0c;支持多种容器技术&#xff0c;如Docker、Kubernetes和Swarm等。它提供了一个易于使用的Web UI界面&#xff0c;可用于管理和监控容器和集群。Portainer旨在使容器管理更加简单…

内部类Lambda

静态内部类 /*** 静态成员是在类加载成字节码时就已经存在的,静态只能访问静态*/ public class Demo {public static void main(String[] args) {Outer.Inner.show();} }class Outer {int num1 10;static int num2 20;static class Inner {static void show() {Outer outer …

Kubernetes实战(六)-多系统架构容器镜像构建实战

1 背景 最近在一个国产化项目中遇到了这样一个场景&#xff0c;在同一个 Kubernetes 集群中的节点是混合架构的&#xff0c;即其中某些节点的 CPU 架构是 x86 的&#xff0c;而另一些节点是 ARM 的。为了让镜像在这样的环境下运行&#xff0c;一种最简单的做法是根据节点类型为…

6-15 复制字符串

#include<stdio.h> #include<string.h> int main(){int i;char s1[80],s2[80];printf("输入的s2是&#xff1a;");scanf("%s",s2);for(i0;i<strlen(s2);i)s1[i]s2[i];printf("复制后的s1是&#xff1a;%s\n",s1); return 0;}

HttpRunner自动化工具之实现参数化传递

参数化实现及重复执行 参数化测试&#xff1a;在接口测试中&#xff0c;为了实现不同组数据对同一个功能模块进行测试&#xff0c;需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化&#xff1a; 1、在YAML/JSON 中直接指定参数列表 2、…

【STM32】STM32学习笔记-STM32简介(02)

00. 目录 文章目录 00. 目录01. STM32简介1.1 STM32是什么1.2 STM32应用领域1.3 STM32命名规则1.4 STM32选型 02. ARM简介2.1 ARM是什么2.2 ARM系列 03. STM32开发板3.1 MCU简介3.2 STM32开发板3.3 STM32硬件资源 04. STM32系统架构05. STM32引脚定义06. STM32启动配置07. STM3…

构建第一个ArkTS应用(纯HarmonyOS应用)

1. 安装开发工具 在华为开发者官方上下载HarmonyOS应用专用的开发工具&#xff0c;链接地址&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 要想使用开发工具让项目跑起来&#xff0c;需要10G的磁盘空间。开发工具需要的磁盘空间为2.36G&#xff1b;SDK需…

深度学习记录--logistic回归函数的计算图

计算图用于logistic回归函数 先回顾一下单一样本的logistic回归损失函数的公式&#xff0c;公式如下&#xff1a; 将logistic函数用计算图表示出来(以两个基础量为例)&#xff0c;计算图如下&#xff1a; 前向传播已经完成&#xff0c;接下来完成后向传播 运用链式法则依次求…

The Big IAM Challenge 云安全 CTF 挑战赛

The Big IAM Challenge 云安全 CTF 挑战赛 今天&#xff0c;我们来做一下有关于云安全 的CTF 挑战赛 The Big IAM Challenge,旨在让白帽子识别和利用 IAM错误配置&#xff0c;并从现实场景中学习&#xff0c;从而更好的认识和了解IAM相关的风险。比赛包括6个场景&#xff0c;每…

LeetCode 232.用栈实现队列

题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回…

智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

@[toc] 智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者…

别再争国漫一哥了,真正的王者回来了!

相信很多漫迷都知道&#xff0c;《斗罗大陆》动画在播出的五年期间一直稳稳占领国漫各榜单第一的位置。现在它已经完结了大半年&#xff0c;尽管《斗破苍穹》《完美世界》等动画都在争国漫一哥&#xff0c;但排名总是上下浮动&#xff0c;没有定论。 但就在今天&#xff0c;《斗…

一款充电桩解决方案设计

一、基本的概述 项目由IP6536提供两路5V 1.5A 的USB充电口&#xff0c;IP6505提供一路最大24W的USB快充口支持QC3.0 / DCP / QC2.0 / MTK PE1.1 / PE2.0 / FCP / SCP / AFC / SFCP的快充协议&#xff0c;电池充电由type-C输入经过IP2326输出最高15W快充对电池进行充电&#xf…

C++:异常

文章目录 传统的处理错误的方式C异常C异常的使用抛异常的举例异常的重新抛出异常规范 自定义异常体系C标准库中的异常体系异常的优缺点 本篇总结的是C中关于异常的内容 传统的处理错误的方式 在C语言中&#xff0c;对于传统的错误方式有 终止程序&#xff1a;例如assert&…