拓扑排序(C++类封装+数组模拟队列和邻接表)
拓扑序列
对于任何无回路的AOV网,其顶点均可排成拓扑序列,并且其拓扑序列未必唯一。步骤如下:
1.从网中选择一个入度为0的顶点且输出。
2.从网中删除该顶点及其所有出边。
3.执行1,2,直至所有顶点已输出,或网中剩余顶点均不为0,说明网中存在回路,无法继续拓扑排列。(因此拓扑排列算法也可用来判断一个有向图中是否存在回路。)
准备工作
假定AOV网用邻接表的形式存储,为实现拓扑排序算法,事先需做好以下两项准备工作:
1.建立一个数组count[ ],count[i]的元素值取对应顶点i的入度。
2.建立一个堆栈,栈中存放入度为0的顶点,每当一个顶点的入度为0,就将其压入栈。
优化模拟堆栈
事实上,可以不为该顶点栈另外分配存储空间,而实直接利用入度为0的顶点的count[ ]数组元素的值来模拟堆栈的压入和弹出。方法如下:
1.设置一个”栈顶指针“top,以指示当前”栈顶“位置(这里的”栈“是模拟的,实际并不存在真正的堆栈)。
2.初始化“栈”时,top值设为-1,表示”栈“空。
3.当顶点i的入度为0,应该进“栈”时,将“栈顶指针”所指的顶点序号放在count[i]中,并更新“栈顶指针”top,令其指向顶点i:
count[I]=top;
top=i;
4.当应该从“栈”中弹出一个顶点时,把原“栈顶”位置记录下来,top退到“次栈顶”:
j=top;
top=count[top];
入度为0的顶点均要被压入“栈”,故每一次“弹出”的顶点(top所指向的顶点)入度都是0,显然,顶点的被弹出次序实际是“栈顶”指针top的变化次序,也就是拓扑排序时顶点的输出次序。如果“栈顶指针”top值变为-1,而顶点却未被全部输出,说明网中有回路,此时算法强制终止拓扑排序。
实现代码
形式一:类封装
//对包含n个顶点的AOV网进行拓扑排序
void Graph_List::TopoOrder() {int n = graphsize;int* count = new int[n];//计算count数组for (int i = 0; i < n; i++) count[i] = 0;for (int i = 0; i < n; i++) {Edge* p = Head[i].adjacent;while (p != NULL) {count[p->VerAdj]++;p = p->link;}}int top = -1; //初始化“栈顶指针”for (int i = 0; i < n; i++) {if (count[i] == 0) {count[i] = top;top = i;}}for (int i = 0; i < n; i++) {//若循环体尚未被执行n次,栈顶指针已为-1,说明有回路,终止程序if (top == -1) {cout << "There is a cycle in network!" << endl;return;}else {int j = top; //从栈中弹出一个顶点jtop = count[top];cout << j << endl; //输出该顶点Edge* p = Head.adjacent; //令p为j的边链表头指针while (p != NULL) { //从当前的图中删除与j关联的边int k = p->VerAdj; //k为边终点if (--count[k] == 0) { //入度-1count[k] = top; //若入度为0,则k入栈top = k;}p = p->link;}}}delete[] count;
}
形式二:数组模拟队列和邻接表
const int N=100010;
int n; //顶点数
//数组模拟队列和邻接表的拓扑排序
void topsort() {int q[N]; //模拟队列的数组qint hh = 0, tt = -1; //队头hh,队尾ttint count[N] = { 0 }; //存储图中所有顶点的入度int h[N]={ -1 }, e[N], ne[N], idx = 0; //h为顶点结点,e存储顶点值,ne表示链接关系,-1表示无邻接点//计算所有顶点的入度for (int i = 1; i <= n; i++) {for (int j = h[i]; j != -1; j = ne[j]) {count[e[j]]++;}}//将n个顶点中所有入度为0的顶点入队for (int i = 1; i <= n; i++) {if (count[i] == 0) q[++tt] = i;}//while (hh <= tt) {int t = q[hh++]; //队头取出顶点//遍历所有与t邻接的顶点for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i]; //与t邻接的顶点j的入度都-1count[j]--; if (count[j] == 0) q[++tt] = j; //若入度为0,则入队}}//若队尾tt=n-1,则证明n个顶点全部遍历if (tt == n - 1) {//此时队列内存储的便是拓扑序列for (int i = 0; i < n; i++) cout << q[i] << " ";}//否则,未全部遍历,存在回路else cout << "There is a cycle in network!" << endl;
}
《数据结构》刘大友||第6章 图||6.4拓扑排序
相关文章:
拓扑排序(C++类封装+数组模拟队列和邻接表)
拓扑序列 对于任何无回路的AOV网,其顶点均可排成拓扑序列,并且其拓扑序列未必唯一。步骤如下: 1.从网中选择一个入度为0的顶点且输出。 2.从网中删除该顶点及其所有出边。 3.执行1,2,直至所有顶点已输出࿰…...
FP独立站引流革命:GG斗篷技术解锁流量新策略
在跨境电商领域,FP独立站的运营者们面临着一个共同的挑战:如何在遵守平台规则的同时,有效地吸引和保持流量。传统的引流方法如SEM、SEO、邮件推广和社交媒体营销,对于FP独立站来说,往往效果有限。但现在,一…...
管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)
在Java中,管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)是三种不同的概念,它们在应用中的作用和实现方式有所不同。以下是它们之间的主要区别: 一、管道…...
uniapp组件样式运行至小程序失效
文章目录 一、uniapp样式穿透打包运行至微信小程序失效 一、uniapp样式穿透打包运行至微信小程序失效 组件样式隔离文章参考 解决方案 options: {styleIsolation: "shared",},这个配置项改变了小程序组件的样式隔离模式,使得组件的样式能够共享和继承。…...
认识鸿蒙系统
鸿蒙系统作为华为推出的操作系统,近年来在智能手机、智能穿戴、车载和家居等多个领域取得了显著的发展。其独特的分布式技术、高性能和安全性等特点,使其在与安卓和iOS的竞争中逐渐崭露头角,有望形成三足鼎立之势。 从开发者角度来看&#x…...
Docker Compose部署Rabbitmq(Dockerfile安装延迟队列)
整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…...
硬件基础06 滤波器——无源、有源(含Filter Solutions、Filter Pro、MATLAB Fdatool)
目录 一、Filter Solutions 1、软件资源及安装教程如下 2、使用相关内容 二、Filter Pro使用 1、软件资源及安装教程如下 2、使用相关内容 三、MATLAB Fdatool 1、在matlab命令中输入fdatool 2、输入相关参数,例如低通、FIR、20阶、hamming窗 3、调用 &am…...
shopify模块新增内容或图片
1、后台找到指定的liquid页面,在该页面下方{% schema %} 新增需求 2、添加轮播图功能 {% comment %} 轮播代码 {% endcomment %}{% if block.settings.enable_slider %}<divclass"size-guide-slider swiper"data-slides-per-view"{{ block.setti…...
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
近日,阿里云人工智能平台PAI与复旦大学王鹏教授团队合作,在自然语言处理顶级会议EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。文章提出了一个名为 TAPIR 的知…...
置信传播算法复现
本文所涉及所有资源均在 传知代码平台 可获取。 目录 一.背景及意义介绍 1. 实际应用广泛 2. 理论研究重要性...
【在Linux世界中追寻伟大的One Piece】poll代码改写
目录 1 -> poll代码改写 1 -> poll代码改写 结合select代码,将select server更改成为pollserver,不是一件困难的事情。 #pragma once#include <iostream> #include <string> #include <poll.h> #include <memory> #inc…...
C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数
在这篇文章中,我们将探讨自我规则非单调激活函数——Mish在神经网络中的应用。了解Mish函数的工作原理,将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么?能在C中创建激活函数吗?自我规则非…...
Java 的 Scanner 类:控制台输入与文件扫描
Java 的 Scanner 类是一个非常方便的工具类,主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容,但我们通常更喜欢它用于控制台输入,因为扫描文件可以通过文件流来完成。接下来,我们将通过几个简单的示例来讲解…...
使用纯HTML和CSS绘制圣诞树:打造网页中的冬日奇景
### HTML & CSS 实现节日圣诞树:一步步打造你的冬季主题网页 在这篇文章中,我们将使用纯HTML和CSS创建一棵节日圣诞树。通过简单的代码,您可以在网页上实现一棵带有星星、彩球装饰的圣诞树,为网站增添节日氛围。 ### 实现思…...
深度学习-图像评分实验(TensorFlow框架运用、读取处理图片、模型建构)
目录 0、实验准备 ①实验环境 ②需要下载的安装包 ③注意事项(很关键,否则后面内容看不懂) ④容易出现的问题 1、查看数据并读取数据。 2、PIL库里的Image包进行读取(.resize更改图片尺寸,并将原始数据归一化处…...
羲和数据集收集器0.9
为了进一步完善代码,增强其文字抓取能力和文件读取能力,我们做以下改进: 增强 DOCX 文档的文本提取:不仅提取段落和文本框内容,还提取表格中的文本。 增强 PDF 文档的文本提取:不仅提取页面文本和注释,还提取表格中的文本。 优化文本清理:确保文本清理更加彻底,避免不…...
哈尔滨等保测评常见误区破解:避免陷入安全盲区
在当今信息化社会,网络安全已成为各行各业不可忽视的重要议题。等级保护(简称“等保”)作为我国网络安全的基本制度,旨在通过划分不同安全保护等级,对信息系统实施分等级的安全保护。然而,在实施等保测评的…...
Python学习------第四天
Python的判断语句 一、布尔类型和比较运算符 二、 if语句的基本格式 if语句注意空格缩进!!! if else python判断语句的嵌套用法:...
【Django】配置文件 settings.py
【Django】配置文件 settings.py 和Flask框架不同,Django框架项目在创建的时会默认生成配置文件settings.py,在深入学习Django框架前,我们先简单了解settings.py文件内非注释代码, from pathlib import Path BASE_DIR Path(__f…...
量化交易系统开发-实时行情自动化交易-Okex K线数据
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取K线数…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
