【图论】链式前向星+BFS实现拓扑排序(topSort)

拓扑排序

👏引入

重要概念: 入度:表示一个结点的所有前结点的个数

问题:给定 n 个结点和 m 个边,然后输入所有的边,输出拓扑排序序列

topsort在网上有很多的介绍,这里就省略,主要讲解拓扑排序的思路。

🤔思路

  • 在输入的时候就去记录每一个结点的入度

    for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;add(u, v);d[v] ++;		//每次插入一条边,后继结点的入度 +1 } 
    // d[v] 表示v结点的入度
    
  • topsort():

    • 先将所有入度为零的结点入队

      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] == 0) {		//如果消除影响后入度为 0,入队 q[++ tt] = j;} }}
      
      • 出队一个元素作为头
        • 遍历每一个出边元素:
          • 消除出队元素对出边元素的入度的影响
          • 检查出边元素是否可以作为新的度为0的结点进行入队
    • 如果是一个有向无环拓扑序列: BFS后队列中的元素就是一个拓扑序列,打印队列即可。

      否则打印一个-1表示不存在拓扑序列

⌨️Code

#include <iostream>
#include <cstring>
using namespace std;/*
* 测试用例:
3 3
1 2
2 3
1 3
*/const int N = 100010;
int h[N], e[N], ne[N], idx;
int d[N], q[N];
int n, m;inline void add(int u, int v) {e[idx] = v, ne[idx] = h[u], h[u] = idx ++;
} inline bool topsort() {int hh = 0, tt = -1;			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] == 0) {		//如果消除影响后入度为 0,入队 q[++ tt] = j;} }}return tt == n - 1;			//判断是不是无环图,tt == n - 1表示所有的结点都经过了处理 
}int main() {cin >> n >> m;		//n 个结点 m 条边memset(h, -1, sizeof h);for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;add(u, v);d[v] ++;		//每次插入一条边,后继结点的入度 +1 } if (topsort()) {for (int i = 0; i < n; i++) {printf("%d ", q[i]);}puts("");} else {puts("-1");}
}

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

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

相关文章

Anthropic Claude 3 加入亚马逊云科技 AI“全家桶”

编辑 | 宋慧 出品 | CSDN AIGC 每天都有新动态发生。最新的消息是亚马逊在 3 月底完成了对 Anthropic 的 40 亿美元投资&#xff08;也是亚马逊 30 年来最大一笔外部投资&#xff09;&#xff0c;以及 GPT-4 最强对手的 Anthropic Claude 3 已经在亚马逊云科技 Amazon Bedrock…

什么是企业邮箱?企业邮箱和个人邮箱的区别是什么?

拥有一个企业邮箱究竟能给公司带什么益处&#xff1f;这是许多中小企业管理者好奇的&#xff0c;很多人觉得邮箱只要用来收发邮件就够了。但实际上&#xff0c;什么是企业邮箱&#xff1f;企业邮箱和个人邮箱在功能范围有着很大的区别。好的企业邮箱不仅能提高公司内部的沟通效…

【电控笔记5】电流环pi参数整定

旋转坐标系下的电压方程&#xff0c;由id和iq计算出ud和uq 把常数项&#xff08;上面两个红框&#xff09;拿出来解耦合&#xff0c;作为前馈&#xff0c;如下 电流环传递函数 电流带宽 响应时间 另一种方法&#xff1a;内膜控制器

RISC-V特权架构 - 中断注入

中断注入 1 中断注入的作用2 mip寄存器3 中断注入后的处理过程 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断注入的作用 中断注入&#xff0c;就是在M模式下&#xff0c;手动向S模式去产生一个中断。 比如&#xff1a;向mip寄存器的bit5…

Web前端开发——Vue概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! Vue Vue是一套前端框架&#xff0c;基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的专注点放在数据上&#xff0c;可以免除原生JavaScript中的DOM操作&am…

600MA线性锂电池充电芯片 - YB4054DJ

描述: YB4054一款完整的单节锂离子电池充电器。其SOT23-5的封装与较少的外部元件数使得YB4054成为便携式应用的理想选择。采用了内部PMOSFET架构&#xff0c;加上防倒充电路&#xff0c;不需要外部检测电阻器和隔离二极管。热反馈可对充电电流进行自动调节&#xff0c;以便在大…

基于Linux C++多线程服务器 + Qt上位机开发 + STM32 + 8266WIFI的智慧无人超市

前言 针对传统超市购物车结账排队时间长、付款效率低的问题&#xff0c;提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账&#xff0c;理由显而易见&#xff1a;自助收银机结账很方便&#xff0c;几乎不用排队&am…

“反正你又看不到,少写一行又何妨......”

单链表专题 1.链表的概念及结构2. 实现单链表3. 链表的分类 1.链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 链表的结构跟火车车厢相似&#xff0c;淡季时⻋次的⻋厢…

GraphQL API-通过未被净化的参数获取隐私信息

GraphQL API-通过未被净化的参数获取隐私信息 Lab: Accessing private GraphQL posts实验前置必要知识点 在GraphQL端点发送任何query{__typename}&#xff0c;它将在其响应中的某处包含{"data": {"__typename": "query"}}字符串&#xff0c;这…

JZM-A系列机械隔膜计量泵

引言&#xff1a; 在现代工业生产过程中&#xff0c;对流体材料的精准计量和输送需求日益提高。面对这一挑战&#xff0c;JZM-A系列机械隔膜计量泵以其卓越的设计、准确的计量能力和高效的性能&#xff0c;为各行各业提供了一种可靠的解决方案。本文将详细解析JZM-A系列计量泵的…

Python100个库分享第13个—awesome-slugify(处理Unicode)

目录 专栏导读库的介绍库的安装基础用法1&#xff1a;用‘-’连接基础用法1&#xff1a;汉字转拼音用‘-’连接有个类似的库 —python-slugify安装总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活的重要组成部分&#xff0c;而Facebook作为最知名的社交媒体平台之一&#xff0c;其成功之处备受瞩目。本文将深入解析Facebook的成功密码&#xff0c;探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

6.1Python之字典的初识

【1】字典的创建与价值 字典&#xff08;Dictionary&#xff09;是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中&#xff0c;键&#xff08;Key&#xff09;必须是唯一的&#xff0c;而值&#xff08;Value&#xff09;则可以是任意类型的数据。…

ue4打包多模块

首先&#xff0c;每个模块&#xff0c;包含插件内的模块在内&#xff0c;都要用IMPLEMENT_MODULE(类名, 模块名)的方式&#xff0c;模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用&#xff0c;用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

花花省V6淘宝客APP社交电商自营商城聚合优惠券系统

首页广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加油、阿里巴巴、去哪网、电影票、飞猪旅行、美团酒店、当当网、肯德基、热门抖货、商品推荐、商品详情、…

基于Springboot + vue +MySQL 留守儿童爱心网站 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;系统架构 &#x1f4da; 数据库设计 &#x1f4ac; 志愿活动属性图 &#x1f4ac; 爱心捐赠实体属性 &#x1f4da; 系统功能的具体实现 &#x1f4ac; 系统功能模块 宣传新闻 志愿活动 &#x1f4ac; 管理员功…

基于java+springboot+vue实现的售楼管理系统(文末源码+Lw)23-255

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本售楼管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

312_C++_QT表格的剪切、拷贝、粘贴,轻量化操作

:拷贝 + 粘贴 :剪切 + 粘贴 void CustomTableWidget::cut() {copy();// 获取所有选定的单元格项QList<QTableWidgetItem*> selectedItemsList

SpringBoot学习之Kibana下载安装和启动(三十二)

一、简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。 …

Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范&#xff0c;这里写一下只是记录几年前自己遇到的问题&#xff0c;好久都忘了&#xff0c;还是写下来比较好。 问题记录&#xff1a;由于变量使用了boolean&#xff0c;并且变量名是is开头的&#xff0c;由于java机制boolean默认是false&#…