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

数据结构--拓扑排序

数据结构–拓扑排序

AOV⽹

A O V ⽹ \color{red}AOV⽹ AOV(Activity On Vertex NetWork,⽤顶点表示活动的⽹):
D A G 图 \color{red}DAG图 DAG(有向⽆环图)表示⼀个⼯程。顶点表示活动,有向边 < V i , V j > <V_i, V_j> <Vi,Vj>表示活动Vi必须先于活动 V j V_j Vj进⾏

注:如果图中存在环路就不是 A O V 网 \color{red}注:如果图中存在环路就不是AOV网 注:如果图中存在环路就不是AOV

DAG图是指有向无环图(Directed Acyclic Graph),是一种有向图的特殊形式。它由一些有向边连接的节点组成,并且不存在任何形式的环。换句话说,从任何一个节点出发,沿着有向边的方向无法经过一系列的节点再回到原始节点。DAG图常用于表示一些具有依赖关系的任务或事件,其中每个节点表示一个任务或事件,有向边表示任务或事件之间的依赖关系。DAG图在计算机科学和工程中有广泛的应用,例如任务调度、编译器优化、数据流分析等领域。

拓扑排序

拓扑排序 \color{red}拓扑排序 拓扑排序:在图论中,由⼀个 有向⽆环图 \color{red}有向⽆环图 有向环图的顶点组成的序列,当且仅当满⾜下列条件时,称为该图的⼀个拓扑排序:
① 每个顶点出现且只出现⼀次。
② 若顶点A在序列中排在顶点B的前⾯,则在图中不存在从顶点B到顶点A的路径。或定义为:拓扑排序是对有向⽆环图的顶点的⼀种排序,它使得若存在⼀条从顶点A到顶点B的路径,则在排序中顶点B出现在顶点A的后⾯。每个AOV⽹都有⼀个或多个拓扑排序序列。

上图其中一个拓扑排序:

拓扑排序的实现:

① 从AOV⽹中选择⼀个没有前驱的顶点并输出。
② 从⽹中删除该顶点和所有以它为起点的有向边。
③ 重复①和②直到当前的AOV⽹为空或当前⽹中不存在⽆前驱的顶点为⽌。

注:拓扑排序序列可能有多个 \color{red}注:拓扑排序序列可能有多个 注:拓扑排序序列可能有多个

拓扑排序代码实现

王道书上代码

个人code

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int n, m;
int h[N], e[N], ne[N], idx;
int q[N], d[N];
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
bool topsort()
{int tt = -1, hh = 0;for(int i = 1; i <= n; i++)if(!d[i])q[++tt] = i;while(hh <= tt){int t = q[hh++];for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];d[j]--;if(!d[j]) q[++tt] = j;}}return tt == n - 1;
}
int main()
{cin >> n >> m;memset(h, -1, sizeof(h));for(int i = 0; i < n; i++){int a, b;cin >> a >> b;add(a, b);d[b]++;}if(topsort()){for(int i = 0; i < n; i++)cout << q[i] << ' ';cout << endl;}else cout << "-1" << endl;return 0;
}

判断是否存在拓扑序

时间复杂度 O(n + m), n 表示点数,m表示边数
bool topsort()
{int hh = 0, tt = -1;// d[i] 存储点i的⼊度for (int i = 1; i <= n; i ++ )if (!d[i])q[ ++ tt] = i;while (hh <= tt){int t = q[hh ++ ];for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (-- d[j] == 0)q[ ++ tt] = j;}}// 如果所有点都⼊队了,说明存在拓扑序列;否则不存在拓扑序列。return tt == n - 1;
}

逆拓扑排序

对⼀个AOV⽹,如果采⽤下列步骤进⾏排序,则称之为 逆拓扑排序 \color{red}逆拓扑排序 逆拓扑排序
① 从AOV⽹中选择⼀个没有后继( 出度为 0 \color{red}出度为0 出度为0)的顶点并输出。
② 从⽹中删除该顶点和所有以它为终点的有向边。
③ 重复①和②直到当前的AOV⽹为空。

其中一个逆拓扑排序

逆拓扑排序代码实现

逆拓扑排序的实现(DFS算法)

DFS判断是否有环:

int vis[N], cnt; // timestamp
int per[N];
bool cyc[N];// 标记
void dfs(int u) //找环 & 标记环
{vis[u] = ++cnt;for (auto v : g[u]){if (per[u] == v)continue;if (!vis[v]){per[v] = u;dfs(v);}else if (vis[u] > vis[v]){for (int i = u; i != v; i = per[i])cyc[i] = true;cyc[v] = true;}}
}

如果单纯判断是否有环,只需要引进父结点(fa)
dfs(u,fa)
如果 u == fa 则存在环

知识点回顾与重要考点

相关文章:

数据结构--拓扑排序

数据结构–拓扑排序 AOV⽹ A O V ⽹ \color{red}AOV⽹ AOV⽹(Activity On Vertex NetWork&#xff0c;⽤顶点表示活动的⽹)&#xff1a; ⽤ D A G 图 \color{red}DAG图 DAG图&#xff08;有向⽆环图&#xff09;表示⼀个⼯程。顶点表示活动&#xff0c;有向边 < V i , V j …...

算法竞赛备赛之搜索与图论训练提升,暑期集训营培训

目录 1.DFS和BFS 1.1.DFS深度优先搜索 1.2.BFS广度优先搜索 2.树与图的遍历&#xff1a;拓扑排序 3.最短路 3.1.迪杰斯特拉算法 3.2.贝尔曼算法 3.3.SPFA算法 3.4.多源汇最短路Floy算法 4.最小生成树 4.1.普利姆算法 4.2.克鲁斯卡尔算法 5.二分图&#xff1a;染色法…...

Linux驱动入门(6.2)按键驱动和LED驱动 --- 将逻辑电平与物理电平分离

前言 &#xff08;1&#xff09;在学习完Linux驱动入门&#xff08;6&#xff09;LED驱动—设备树之后&#xff0c;我们发现一个问题&#xff0c;设备树明明的gpios信息明明有三个元素gpios <&gpio5 3 GPIO_ACTIVE_LOW>; &gpio5 3 用来确定控制那个引脚&#xf…...

CentOS系统环境搭建(十四)——CentOS7.9安装elasticsearch-head

centos系统环境搭建专栏&#x1f517;点击跳转 关于node的安装请看上一篇CentOS系统环境搭建&#xff08;十三&#xff09;——CentOS7安装nvm&#xff0c;&#x1f517;点击跳转。 CentOS7.9安装elasticsearch-head 文章目录 CentOS7.9安装elasticsearch-head1.下载2.解压3.修…...

设计HTML5图像和多媒体

在网页中的文本信息直观、明了&#xff0c;而多媒体信息更富内涵和视觉冲击力。恰当使用不同类型的多媒体可以展示个性&#xff0c;突出重点&#xff0c;吸引用户。在HTML5之前&#xff0c;需要借助插件为网页添加多媒体&#xff0c;如Adobe Flash Player、苹果的QuickTime等。…...

基于YOLOv8模型和Caltech数据集的行人检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要 基于YOLOv8模型和Caltech数据集的行人检测系统可用于日常生活中检测与定位行人&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…...

Flutter 宽高自适应

在Flutter开发中也需要宽高自适应&#xff0c;手动写一个工具类&#xff0c;集成之后在像素后面直接使用 px或者 rpx即可。 工具类代码如下&#xff1a; import dart:ui;class HYSizeFit {static double screenWidth 0.0;static double screenHeight 0.0;static double phys…...

LeetCode 0833. 字符串中的查找与替换

【LetMeFly】833.字符串中的查找与替换 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-and-replace-in-string/ 你会得到一个字符串 s (索引从 0 开始)&#xff0c;你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出&#xff1a;indices,…...

Redis对象和五种常用数据类型

Redisobject 对象 对象分为键对象和值对象 键对象一般是string类型 值对象可以是string&#xff0c;list&#xff0c;set,zset,hash q&#xff1a;redisobj的结构 typedef struct redisObject { //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层实现…...

常用的Elasticsearch查询DSL

1.基本查询 GET /index_name/_search {"query": {"match": {"dispatchClass": "1"}} }2.多条件查询 GET /index_name/_search {"query": {"bool": {"must": [{"match": {"createUser&…...

计算机网络笔记

TCP有连接可靠服务 TCP特点&#xff1a; 1.TCP是面向连接的传输层协议&#xff1b; 2.每条TCP连接只能有两个端点&#xff0c;每条TCP连接是一对一的&#xff1b; 3.TCP提供可靠交付&#xff0c;保证传送数据无差错&#xff0c;不丢失&#xff0c;不重复且有序&#xff1b; 4.…...

高效反编译luac文件

对于游戏开发人员,有时候希望从一些游戏apk中反编译出源代码,进行学习,但是如果你触碰到法律边缘,那么你要非常小心。 这篇文章,我针对一些用lua写客户端或者服务器的编译过的luac文件进行反编译,获取其源代码的过程。 这里我不赘述如何反编译解压apk包的过程了,只说重点…...

密码湘军,融合创新!麒麟信安参展2023商用密码大会,铸牢数据安全坚固堡垒

2023年8月9日至11日&#xff0c;商用密码大会在郑州国际会展中心正式开幕。本次大会由国家密码管理局指导&#xff0c;中国密码学会支持&#xff0c;郑州市人民政府、河南省密码管理局主办&#xff0c;以“密码赋能美好发展”为主题&#xff0c;旨在推进商用密码创新驱动、前沿…...

关于视频监控平台EasyCVR视频汇聚平台建设“明厨亮灶”具体实施方案以及应用

一、方案背景 近几年来&#xff0c;餐饮行业的食品安全、食品卫生等新闻频频发生&#xff0c;比如某火锅店、某网红奶茶&#xff0c;食材以次充好、后厨卫生被爆堪忧&#xff0c;种种问题引起大众关注和热议。这些负面新闻不仅让餐饮门店的品牌口碑暴跌&#xff0c;附带的连锁…...

区块链系统探索之路:私钥的压缩和WIF格式详解

在前面章节中&#xff0c;我们详细介绍了公钥的压缩&#xff0c;在比特币网络中&#xff0c;一个私钥可以对应两个地址&#xff0c;一个地址是由未压缩公钥所生成的地址&#xff0c;另一个就是由压缩公钥所创建的地址&#xff0c;从公钥到区块链地址的转换算法&#xff0c;我们…...

DiffusionDet: Diffusion Model for Object Detection

DiffusionDet: Diffusion Model for Object Detection 论文概述不同之处整体流程 论文题目&#xff1a;DiffusionDet: Diffusion Model for Object Detection 论文来源&#xff1a;arXiv preprint 2022 论文地址&#xff1a;https://arxiv.org/abs/2211.09788 论文代码&#xf…...

CH01_重构、第一个示例

概述 在这一章节&#xff0c;作者给出了一个戏剧演出团售票的示例&#xff1a;剧目有悲剧&#xff08;tragedy&#xff09;和喜剧&#xff08;comedy&#xff09;&#xff1b;为了卖出更多的票&#xff0c;剧团则更具观众的数量来为下次演出打折扣&#xff08;大致意思是这次的…...

学习篇之React Fiber概念及原理

什么是React Fibber&#xff1f; React Fiber 是 React 框架的一种底层架构&#xff0c;为了改进 React 的渲染引擎&#xff0c;使其更加高效、灵活和可扩展。 传统上&#xff0c;React 使用一种称为堆栈调和递归算法来处理虚拟 DOM 的更新&#xff0c;这种方法在大型应用或者…...

商城-学习整理-高级-全文检索-ES(九)

目录 一、ES简介1、网址2、基本概念1、Index&#xff08;索引&#xff09;2、Type&#xff08;类型&#xff09;3、Document&#xff08;文档&#xff09;4、倒排索引机制4.1 正向索引和倒排索引4.2 正向索引4.3 倒排索引 3、相关软件及下载地址3.1 Kibana简介3.2 logstash简介…...

无人机跟随一维高度避障场景--逻辑分析

无人机跟随一维高度避障场景--逻辑分析 1. 源由2. 视频3. 问题3.1 思维发散3.2 问题收敛 4. 图示4.1 水平模式4.2 下坡模式4.3 上坡模式4.4 碰撞分析 5. 总结5.1 一维高度避障场景5.2 业界跟随产品5.3 APM集成跟随 6. 参考资料7. 补充资料 - 大疆智能跟随7.1 炸机7.2 成功 1. 源…...

新手福音:用快马生成交互式cad安装指南,轻松跨过第一道坎

作为一名CAD初学者&#xff0c;第一次安装软件时确实容易手忙脚乱。记得我当初光是找官方下载链接就花了半小时&#xff0c;安装过程中还差点勾选了捆绑软件。后来发现用InsCode(快马)平台可以快速生成交互式安装指南&#xff0c;整个过程变得特别顺畅。今天就把这个实用方法分…...

从理论到实践:基于EKF与1RC模型的锂离子电池SOC在线估计与Simulink仿真

1. 锂离子电池SOC估计为什么这么重要&#xff1f; 如果你用过电动车或者手机&#xff0c;肯定遇到过电量显示不准的情况。明明显示还有30%电量&#xff0c;结果突然关机&#xff1b;或者充到80%就再也充不进去了。这些问题的核心&#xff0c;都跟电池的荷电状态&#xff08;SO…...

【飞控】QGroundControl与Mission Planner:如何根据项目需求选择最佳地面站

1. 两款地面站软件的核心定位差异 第一次接触无人机开发时&#xff0c;我也曾被QGroundControl和Mission Planner搞得晕头转向。这两款软件就像工具箱里的不同工具&#xff0c;关键是要知道什么时候该用哪一把。QGroundControl&#xff08;简称QGC&#xff09;给我的第一印象是…...

基于python开发的送货上门系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分技术实现要点扩展功能建议部署与维护项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用户管理模块 用户注册与登录…...

Pixel Epic · Wisdom Terminal 部署与压测:使用.accelerate库优化推理性能

Pixel Epic Wisdom Terminal 部署与压测&#xff1a;使用.accelerate库优化推理性能 1. 引言 如果你正在使用Pixel Epic Wisdom Terminal进行AI推理任务&#xff0c;可能会遇到性能瓶颈问题。今天我们就来聊聊如何用Hugging Face的.accelerate库来提升推理速度&#xff0c;…...

智能抢购京东茅台:零基础上手的成功率提升指南

智能抢购京东茅台&#xff1a;零基础上手的成功率提升指南 【免费下载链接】jd_maotai 抢京东茅台脚本&#xff0c;定时自动触发&#xff0c;自动预约&#xff0c;自动停止 项目地址: https://gitcode.com/gh_mirrors/jd/jd_maotai 在电商抢购的激烈竞争中&#xff0c;这…...

Qwen-Image-2512-Pixel-Art-LoRA 模型原理浅析:理解LoRA在图像生成中的作用

Qwen-Image-2512-Pixel-Art-LoRA 模型原理浅析&#xff1a;理解LoRA在图像生成中的作用 最近在玩AI画图的朋友&#xff0c;可能都遇到过这样的烦恼&#xff1a;想让一个通用的大模型画出特定风格&#xff0c;比如复古的像素风&#xff0c;结果要么画得不像&#xff0c;要么就得…...

抽象推理终极指南:10个ARC经典案例解析助你掌握核心技巧

抽象推理终极指南&#xff1a;10个ARC经典案例解析助你掌握核心技巧 【免费下载链接】ARC-AGI The Abstraction and Reasoning Corpus 项目地址: https://gitcode.com/GitHub_Trending/ar/ARC-AGI 抽象与推理语料库&#xff08;ARC&#xff09;是一个专门用于评估通用人…...

耦合详解-模块

耦合详解 耦合(Coupling)是衡量软件模块之间相互依赖程度的指标。低耦合是优秀软件设计的核心目标之一,它使系统更易于维护、测试和扩展。 1. 耦合的本质 耦合描述的是两个模块(类、组件、服务)之间的依赖关系强度。当修改一个模块时,需要修改其他模块的程度越高,耦合…...

城通网盘限速破解:ctfileGet让下载效率提升10倍的技术革命

城通网盘限速破解&#xff1a;ctfileGet让下载效率提升10倍的技术革命 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 在数字化协作日益频繁的今天&#xff0c;网盘已成为信息传递的重要枢纽。然而城通…...