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

拓扑排序模板及例题

概念

一个有向无环图必然存在一个拓扑序列与之对应。

流程:

  • 先将所有入度为0的节点入队
  • 将队列中的节点出队,出队序列就是对应拓扑序。对于弹出的节点x,遍历x所有出度y,对y进行入读减一操作
  • 检查入度减一之后的节点y,如果入度为0,再次将其入队
  • 循环流程2、3知道队列为空

在这里插入图片描述
以此图为例,开始时节点1的入度为0,将其入队,而后节点2、3的入度均减一,此时节点2的入度为0,将其入队,然后节点3、4的入度减一,最后将节点3、4一次入队。
最终的拓扑排序结果是1、2、3、4

模板

给定一个 n 个点 m条边的有向图,点的编号是 1到 n,图中可能存在重边和自环。

请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。

若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y之前,则称 A是该图的一个拓扑序列。

输入格式
第一行包含两个整数 n和m。

接下来 m行,每行包含两个整数 x和y,表示存在一条从点 x到点y的有向边(x,y)。

输出格式
共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。否则输出 −1。

数据范围
1≤n,m≤105
输入样例:
3 3
1 2
2 3
1 3
输出样例:
1 2 3

const int N = 100010;int n, m;			// 题目需要
int h[N], e[N], ne[N], idx;	// 构建双重链表
int d[N];			// 节点入度
int q[N];			// 存放结果void add(int a, int b)		// 让a指向b
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}bool topsort()
{int hh = 0, tt = -1;for (int i = 1; i <= n; i ++ )		// 寻找入度为0的节点,装入queueif (!d[i])q[ ++ tt] = i;while (hh <= tt)				// queue不为空{int t = q[hh ++ ];			// 取得队列头,其入度为0for (int i = h[t]; i != -1; i = ne[i])	// 遍历该点所有子节点,将子节点入度-1{int j = e[i];			// i是idx的地址,j是节点if (-- d[j] == 0)		// 入度-1q[ ++ tt] = j;		//如果入度为0,加入queue}}return tt == n - 1;
}int main()
{scanf("%d%d", &n, &m);memset(h, -1, sizeof h);for (int i = 0; i < m; i ++ ){int a, b;scanf("%d%d", &a, &b);add(a, b);d[b] ++ ;		// 入度+1}if (!topsort()) puts("-1");else{for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);puts("");}return 0;
}

例题:剑指offerII 114.外星文字典

现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同。

给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。

请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 “” 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。

字符串 s 字典顺序小于 字符串 t 有两种情况:

在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么 s 的字典顺序小于 t 。
如果前面 min(s.length, t.length) 字母都相同,那么 s.length < t.length 时,s 的字典顺序也小于 t 。

示例 1:

输入:words = [“wrt”,“wrf”,“er”,“ett”,“rftt”]
输出:“wertf”

链接:https://leetcode.cn/problems/Jf1JuT


相关文章:

拓扑排序模板及例题

概念 一个有向无环图必然存在一个拓扑序列与之对应。 流程&#xff1a; 先将所有入度为0的节点入队将队列中的节点出队&#xff0c;出队序列就是对应拓扑序。对于弹出的节点x&#xff0c;遍历x所有出度y&#xff0c;对y进行入读减一操作检查入度减一之后的节点y&#xff0c;…...

linux查看nginx安装路径

linux查看nginx安装路径 有几种方法可以查看nginx的安装路径: 使用which命令: which nginx这个命令会返回nginx的二进制文件路径,一般也是安装路径。 查看nginx的进程,得到安装路径: ps aux | grep nginx输出结果中有nginx的进程路径,这个也是安装路径。 在nginx的配置文…...

【生态环境保护】绿水青山就是金山银山——生态环保篇

环保是一个持续性的话题&#xff0c;不仅仅是在国内&#xff0c;整个世界都是一个命运共同体从城市垃圾分类&#xff0c;到农村/村镇污水治理&#xff0c;城乡一体化和因地制宜的实施方式&#xff0c;是我们一直在探索的。 从余村到全国&#xff0c;从中国到世界&#xff0c;“…...

配置Docker镜像加速器-Docker命令-Docker 容器的数据卷

Docker架构 docker进程&#xff08;daemon&#xff09; 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件…...

ARM开发调试方法

用户选用ARM处理器开发嵌入式系统时&#xff0c;选择合适的开发工具可以加快开发进度&#xff0c;节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理及函数库的集成开发环境&#xff08;IDE&#xff09;一般来说是必不可少的&#xff0c;…...

【Spring篇】IOC/DI注解开发

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean 2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖…...

1 Unix基础知识

1.1 登录 1.1 登录名 登录Unix系统时&#xff0c;要先输入登录名&#xff0c;然后再输入口令。系统再其口令文件&#xff08;/etc/password文件&#xff09;查看登录名。口令文件中的登录项由7个以冒号分隔的字段组成&#xff1a;登录名&#xff0c;加密口令&#xff0c;数字用…...

【翻译一下官方文档】认识uniCloud云数据库(基础篇)

我将用图文的形式&#xff0c;把市面上优质的课程加以自己的理解&#xff0c;详细的把&#xff1a;创建一个uniCloud的应用&#xff0c;其中的每一步记录出来&#xff0c;方便大家写项目中&#xff0c;做到哪一步不会了&#xff0c;可以轻松翻看文章进行查阅。&#xff08;此文…...

全局解释器锁 GIL

问题 你已经听说过全局解释器锁 GIL&#xff0c;担心它会影响到多线程程序的执行性能。 解决方案 尽管 Python 完全支持多线程编程&#xff0c;但是解释器的 C 语言实现部分在完全并行执行时并不是线程安全的。 实际上&#xff0c;解释器被一个全局解释器锁保护着&#xff…...

github 下载文件加速 https://moeyy.cn/gh-proxy/

GitHub文件链接带不带协议头都可以&#xff0c;支持release、archive以及文件&#xff0c;右键复制出来的链接都是符合标准的。 注意&#xff0c;不支持项目文件夹&#xff0c;请使用Git。 分支源码&#xff1a;https://github.moeyy.xyz/https://github.com/moeyy/project/arc…...

第五章 资源包使用

游戏开发中会大量使用模型文件&#xff0c;图片文件&#xff0c;这些资源都需要事先导入到项目中去。导入的方式非常简单&#xff0c;将这些文件直接复制到项目中的Assets目录下即可。Unity 会在文件添加到 Assets 文件夹时自动检测到这些文件并同步显示在Project视图中。 Uni…...

Linux od命令

Linux od命令用于输出文件内容。 od指令会读取所给予的文件的内容&#xff0c;并将其内容以八进制字码呈现出来。 语法 od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符…...

【15】SCI易中期刊推荐——电子电气 | 仪器仪表(中科院4区)

💖💖>>>加勒比海带<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉 | 深度学习Tr…...

基于PaddleServing的串联部署 ocr 识别模型

要点&#xff1a; 使用paddleserving服务 1 首先需要安装PaddleServing部署相关的环境 PaddleServing是PaddlePaddle推出的一种高性能、易扩展、高可用的机器学习服务框架。PaddleOCR中使用PaddleServing主要是为了将训练好的OCR模型部署到线上环境&#xff0c;提供API服务&a…...

java OutputStream学习

1.概要 OutputStream位于java.io&#xff0c;它在Java 实现的IO类库中是一个很基础的抽象类。在层级上&#xff0c;是所有字节输出流类的父类&#xff0c;在功能上&#xff0c;表示接受字节并把它们输出。 2.实现类及子类简介 OutputStream有诸多子类&#xff1a; ByteAr…...

java 上传文件生成二进制流文件

最近在项目中遇到一个问题&#xff1a;需要将上传的文件生成输出流&#xff0c;然后将输出流转换为输入流上传到oss。 -------------------------------------------导出代码实现---------------------------------------------------------- ByteArrayOutputStream baos nu…...

质量小议22 -- 多少分合适

60分万岁~&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff01;&#xff01; 如果用分数评价质量&#xff0c;多少分合适&#xff1f;60&#xff0c;70&#xff0c;80...还是100&#xff0c;或者 120 对于质量的提升&#xff0c;是雪中送炭&#xff0c;还是锦上添…...

变频器参数设定说明

使用默贝克MT110-0R4-S2B实现下面的练习题&#xff1a; 1、先恢复出厂设置&#xff0c;再输入电机参数&#xff0c;选择静态调谐 2、两种运行模式&#xff1a;多段速&#xff08;8段&#xff09;和简易PLC&#xff08;4段&#xff09; 3、面板启停&#xff0c;运行模式通过外部…...

实用调试技巧

目录&#xff1a; 1.什么是bug&#xff1f; 2.调试是什么&#xff1f;有多重要&#xff1f; 3.debug和release的介绍 4.Windows环境调试介绍 5.一些调试的实例 6.如何写出好(易于调试)的代码 7.编程常见的错误 1.什么是bug&#xff1f; bug--->臭虫、虫子。 为什么含…...

谁是液冷行业真龙头?疯狂的液冷技术!

“人工智能领域AIGC”、“ChatGPT”、“数据特区”、“东数西算”、“数据中心”&#xff0c;可以说是2023年最热的概念&#xff0c;算力提升的背后&#xff0c;处理器的功耗越来越高&#xff0c;想发挥出处理器的最高性能&#xff0c;需要更高的散热效率。 算力井喷之下&…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...