数据结构-拓扑排序

news2024/11/18 10:30:26

介绍

介绍拓扑排序之前,首先要先引入一个名词,即AOV网:

  • 如果有一项工程,它的完成需要多个活动组成,将活动看做结点,活动间的联系看做图的边,那么这样一个表示工程活动的有向图(活动存在制约关系,进行了一项才能进行下一项,所以是有向图),被称为AOV网

AOV网中不能存在回路,因为一个活动的开始需要其他活动的完成作为先决条件,但不能是活动本身导致了活动的开始。

拓扑序列的定义为:在一个AOV网中,如果从顶点i到顶点j之间有一条路径,则顶点序列中i必须在j之前。这样的顶点序列称为拓扑序列。

拓扑排序,就是将一个有向图构造成一个拓扑序列的过程。

构造时若此网的顶点可以被全部输出,则没有回路的存在,是AOV网;如果有顶点不能输出,则说明这个网存在回路,不是AOV网

具体实现

拓扑排序的基本思路为:不断从AOV网中选择一个入度为0的顶点,删除此顶点与其连接的边,直到输出全部顶点为止

(入度值,表示指向该顶点的边的数量,入度为0即没有任何边指向这个顶点)

具体步骤为:

  1. 初始化一个队列,用来储存入度为0的顶点
  2. 将所有入度为0的顶点入队
  3. 依次取出入度为0的点,打印此顶点,对此顶点相连的边进行遍历
  4. 将与其相连的顶点入度-1,如果为0则入队
  5. 重复3,4,直到所有顶点都被输出

考虑到需要利用顶点的删除,相比于邻接矩阵,邻接表这种数据结构构成的图会更方便操作

在结构体中,需要有顶点域,入度值域与指向边表的指针

代码如下所示

typedef struct edge{
	int adjvex;//邻接点域,用于储存该顶点对应下标
	int info;//储存权值
	struct edge* next;//链域,指向下一个邻接点
}edge;
typedef struct vex{
	int v;//储存顶点
	int in;//记录入度;
	edge* first;//边表头指针
}vex,adjlist[MAX];
//储存邻接链表构成的网图信息
typedef struct{
	adjlist al;
	int numE,numN;
}graphAL;

拓扑排序过程如下

bool topo(graphAL g){
	int n=0;//记录输出的顶点值,判断是否为AOV网
	deque <int>q;//创建队列
	for (int i=0;i<g.numN;i++){
		if (g.al[i].in==0){//入度为0
			q.push_back(i);//入队
		}
	}
	while(!q.empty()){
		cout<<q.front()<<" ";//将入度为0的顶点输出
		n++;//输出的顶点数加1
		edge* e=g.al[q.front()].first;
		q.pop_front();//此顶点出队
		while(e){//处理其相邻顶点
			int temp=e->adjvex;//记录相邻顶点
            g.al[temp].in--;//入度减1
			if (g.al[temp].in==0)//入度为0则入队
			q.push_back(temp);
			e=e->next;//继续处理下一个相邻顶点
		}
	}
	if (n!=g.numN) return false;//输出的顶点数不对,则不是AOV图
	else return true;
}

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

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

相关文章

【软考高项】【教材知识梳理】- 15 - 第15章 - 项目风险管理

一、基本问题 1&#xff1a;按照可预测性&#xff0c;风险分哪三类&#xff1f; &#xff08;1&#xff09;已知风险&#xff1a;如项目目标不明确&#xff0c; 过分乐观的进度计划&#xff0c; 设计或施工变更和材料价格波动等。&#xff08;2&#xff09;可预测风险&#xff…

电脑黑屏什么都不显示怎么办 电脑开机黑屏不显示任何东西的4种解决办法

相信有很多网友都有经历电脑开机黑屏不显示任何东西&#xff0c;找了很多方法都没处理好&#xff0c;其实关于这个的问题&#xff0c;首先还是要了解清楚开机黑屏的原因&#xff0c;才能够对症下药&#xff0c;下面大家可以跟小编一起来看看怎么解决吧 电脑开机黑屏不显示任何…

【设计模式】使用适配器模式做补偿设计

文章目录 1.概述2.两种适配器模式2.1.类适配器2.2.对象适配器 3.总结 1.概述 适配器模式是一种结构型设计模式&#xff0c;它提供了一个中间层&#xff0c;通过这个中间层&#xff0c;客户端可以使用统一的接口与具有不同接口的类进行交互&#xff0c;也就是说&#xff0c;将一…

Chromium的下载地址

Chromium的下载地址&#xff1a; Download Chromiumhttps://www.chromium.org/getting-involved/download-chromium/ https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefixWin_x64/https://commondatastorage.googleapis.com/chromium-br…

[设计模式Java实现附plantuml源码~行为型]协调多个对象之间的交互——中介者模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

linux CentOs 安装docker 推荐生产环境使用

目录 1. 在CentOs上安装docker所需的系统环境 2. 卸载旧版本 2.1 查看是否已安装docker 2.2 卸载已安装的docker 3. 安装方式 3.1 使用rpm存储库安装(推荐使用该方法) 3.2 从包中安装 4. 开始docker 1. 在CentOs上安装docker所需的系统环境 需要以下CentOS版本之一的维…

基于JAVA的人事管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员功能模块2.2 普通员工功能模块2.3 答辩文案 三、系统展示四、核心代码4.1 查询职称4.2 新增留言回复4.3 工资申请4.4 工资审核4.5 员工请假 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的人…

STM32-开发板介绍

市面的开发板有很多&#xff0c;博主有幸了解到一款集成度较高的开发板&#xff0c;朗峰STM32F103RCT6&#xff0c;知名度不高&#xff0c;性价比很高&#xff0c;这是目前唯一一款集成了大量传感器和功能模块的高集成度开发板。 巨大的优势在于&#xff0c;传感器和功能模块的…

高效社区:数字孪生在智慧社区中的应用与实践

随着科技的快速发展&#xff0c;数字孪生技术在智慧社区建设中扮演着越来越重要的角色。数字孪生技术通过建立物理空间与数字空间的交互映射关系&#xff0c;实现对社区设施、环境、服务等智能化管理和服务&#xff0c;为未来社区的发展提供了新的动力。本文将探讨数字孪生在智…

【AI大语言模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

深入理解指针(c语言)

目录 一、使用指针访问数组二、数组名的理解1、数组首元素的地址2、整个数组 三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组 一、使用指针访问数组 可以使用指针来访问数组元素。例如&#xff0c;可以声明一个指针变量并将其指向数组的第一个元素&#xff0c;然…

Leo赠书活动-17期 《基础软件之路:企业级实践及开源之路》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

基于深度学习的连锁酒店场景识别与部署实践指南

基于深度学习的连锁酒店场景识别与部署实践指南 项目背景与意义数据集介绍数据预处理与加载模型选择与开发模型选择模型训练模型评估测试 模型部署服务 项目背景与意义 在智能旅游行业&#xff0c;场景识别&#xff08;又称为场景分类&#xff09;是一个关键技术&#xff0c;它…

Autosar-CanIf模块介绍

4.1CanIf模块简介 CanIf模块是为了要隔离MCal层与服务层,因此CanIf不可直接操作硬件资源。然而CanIf传输数据、接收数据要使用到Can模块的缓存,如果直接使用Can模块的缓存的话,那CanIf就与MCal层耦合在一起了。 为了解决这个问题,CanIf层使用了一个HOH的概念:Hardware Obj…

情暖冬日团建——手拉手助成长社会融合实践活动

2月21日上午合肥六中高一&#xff08;14&#xff09;班团支部的曹文祥、储诚羲、杜尤扬、林彦锋、古胜宇、周文涛、许君昊、郭稷豪、吴彤、徐欣悦 、 褚福磊、高彦希、李柄杉、周子翔、高杨、姚子涵和高一&#xff08;3&#xff09;班孙锦宸、高一&#xff08;7&#xff09;班朱…

Istio实战:Istio Kiali部署与验证

目录 前言一、Istio安装小插曲 注意事项 二、Kiali安装三、Istio测试参考资料 前言 前几天我就开始捣腾Istio。前几天在执行istioctl install --set profiledemo -y 的时候老是在第二步就报错了&#xff0c;开始我用的istio版本是1.6.8。 后面查看k8s与istio的版本对应关系后发…

FIPS 140-3认证有什么重要性

FIPS 140-3&#xff0c;全称为《Federal Information Processing Standards Publication 140-3》&#xff0c;是美国联邦政府制定的一套关于加密模块的标准。该标准旨在确保加密技术在政府、军事和商业等领域的安全性和合规性。自1994年首次发布以来&#xff0c;FIPS 140-3已成…

【学习总结】慢SQL治理经验总结

一、慢SQL定义 执行超过1s的SQL为慢SQL 三、慢SQl的风险 系统的响应时间延迟&#xff0c;影响用户体验 资源占用增加&#xff0c;增高了系统的负载&#xff0c;其他请求响应时间也可能会收到影响。 慢SQL占用数据库连接的时间长,如果有大量慢SQL查询同时执行&#xff0c;可能…

人工智能讲师AI讲师大模型讲师叶梓介绍及大语言模型技术原理与实践提纲

叶梓&#xff0c;上海交通大学计算机专业博士毕业&#xff0c;高级工程师。主研方向&#xff1a;数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家&#xff0c;市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的建设工作&#xff…

[ai笔记11] 论ai韭菜的自我修养

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵学习ai以及观点分享的第11篇内容&#xff01; 上班之后时间确实少了许多&#xff0c;但是最近也没闲着&#xff0c;关于ai的学习一直在探索两个部分&#xff0c;一个是看那本有名的书《这就是ChatGPT》&#xff0c;另外一个则…