当前位置: 首页 > news >正文

拓扑排序(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网&#xff0c;其顶点均可排成拓扑序列&#xff0c;并且其拓扑序列未必唯一。步骤如下&#xff1a; 1.从网中选择一个入度为0的顶点且输出。 2.从网中删除该顶点及其所有出边。 3.执行1&#xff0c;2&#xff0c;直至所有顶点已输出&#xff0…...

FP独立站引流革命:GG斗篷技术解锁流量新策略

在跨境电商领域&#xff0c;FP独立站的运营者们面临着一个共同的挑战&#xff1a;如何在遵守平台规则的同时&#xff0c;有效地吸引和保持流量。传统的引流方法如SEM、SEO、邮件推广和社交媒体营销&#xff0c;对于FP独立站来说&#xff0c;往往效果有限。但现在&#xff0c;一…...

管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)

在Java中&#xff0c;管道&#xff08;Pipes&#xff09;、过滤器&#xff08;Filters&#xff09;和拦截器&#xff08;Interceptors&#xff09;是三种不同的概念&#xff0c;它们在应用中的作用和实现方式有所不同。以下是它们之间的主要区别&#xff1a; 一、管道&#xf…...

uniapp组件样式运行至小程序失效

文章目录 一、uniapp样式穿透打包运行至微信小程序失效 一、uniapp样式穿透打包运行至微信小程序失效 组件样式隔离文章参考 解决方案 options: {styleIsolation: "shared",},这个配置项改变了小程序组件的样式隔离模式&#xff0c;使得组件的样式能够共享和继承。…...

认识鸿蒙系统

鸿蒙系统作为华为推出的操作系统&#xff0c;近年来在智能手机、智能穿戴、车载和家居等多个领域取得了显著的发展。其独特的分布式技术、高性能和安全性等特点&#xff0c;使其在与安卓和iOS的竞争中逐渐崭露头角&#xff0c;有望形成三足鼎立之势。 从开发者角度来看&#x…...

Docker Compose部署Rabbitmq(Dockerfile安装延迟队列)

整个工具的代码都在Gitee或者Github地址内 gitee&#xff1a;solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github&#xff1a;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、输入相关参数&#xff0c;例如低通、FIR、20阶、hamming窗 3、调用 &am…...

shopify模块新增内容或图片

1、后台找到指定的liquid页面&#xff0c;在该页面下方{% schema %} 新增需求 2、添加轮播图功能 {% comment %} 轮播代码 {% endcomment %}{% if block.settings.enable_slider %}<divclass"size-guide-slider swiper"data-slides-per-view"{{ block.setti…...

【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR

近日&#xff0c;阿里云人工智能平台PAI与复旦大学王鹏教授团队合作&#xff0c;在自然语言处理顶级会议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代码&#xff0c;将select server更改成为pollserver&#xff0c;不是一件困难的事情。 #pragma once#include <iostream> #include <string> #include <poll.h> #include <memory> #inc…...

C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数

在这篇文章中&#xff0c;我们将探讨自我规则非单调激活函数——Mish在神经网络中的应用。了解Mish函数的工作原理&#xff0c;将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么&#xff1f;能在C中创建激活函数吗&#xff1f;自我规则非…...

Java 的 Scanner 类:控制台输入与文件扫描

Java 的 Scanner 类是一个非常方便的工具类&#xff0c;主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容&#xff0c;但我们通常更喜欢它用于控制台输入&#xff0c;因为扫描文件可以通过文件流来完成。接下来&#xff0c;我们将通过几个简单的示例来讲解…...

使用纯HTML和CSS绘制圣诞树:打造网页中的冬日奇景

### HTML & CSS 实现节日圣诞树&#xff1a;一步步打造你的冬季主题网页 在这篇文章中&#xff0c;我们将使用纯HTML和CSS创建一棵节日圣诞树。通过简单的代码&#xff0c;您可以在网页上实现一棵带有星星、彩球装饰的圣诞树&#xff0c;为网站增添节日氛围。 ### 实现思…...

深度学习-图像评分实验(TensorFlow框架运用、读取处理图片、模型建构)

目录 0、实验准备 ①实验环境 ②需要下载的安装包 ③注意事项&#xff08;很关键&#xff0c;否则后面内容看不懂&#xff09; ④容易出现的问题 1、查看数据并读取数据。 2、PIL库里的Image包进行读取&#xff08;.resize更改图片尺寸&#xff0c;并将原始数据归一化处…...

羲和数据集收集器0.9

为了进一步完善代码,增强其文字抓取能力和文件读取能力,我们做以下改进: 增强 DOCX 文档的文本提取:不仅提取段落和文本框内容,还提取表格中的文本。 增强 PDF 文档的文本提取:不仅提取页面文本和注释,还提取表格中的文本。 优化文本清理:确保文本清理更加彻底,避免不…...

哈尔滨等保测评常见误区破解:避免陷入安全盲区

在当今信息化社会&#xff0c;网络安全已成为各行各业不可忽视的重要议题。等级保护&#xff08;简称“等保”&#xff09;作为我国网络安全的基本制度&#xff0c;旨在通过划分不同安全保护等级&#xff0c;对信息系统实施分等级的安全保护。然而&#xff0c;在实施等保测评的…...

Python学习------第四天

Python的判断语句 一、布尔类型和比较运算符 二、 if语句的基本格式 if语句注意空格缩进&#xff01;&#xff01;&#xff01; if else python判断语句的嵌套用法&#xff1a;...

【Django】配置文件 settings.py

【Django】配置文件 settings.py 和Flask框架不同&#xff0c;Django框架项目在创建的时会默认生成配置文件settings.py&#xff0c;在深入学习Django框架前&#xff0c;我们先简单了解settings.py文件内非注释代码&#xff0c; from pathlib import Path BASE_DIR Path(__f…...

量化交易系统开发-实时行情自动化交易-Okex K线数据

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取K线数…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...