【第二十一课】拓扑序列bfs (acwing-848有向图的拓扑序列 / c++代码 )

拓扑序列

关于拓扑排序有几点:

1.拓扑序列中,每条有向边都是从序列中前面的顶点指向后面的顶点。

2.有向无环图(DAG)一定有拓扑序列。存在环的图一定没有拓扑序列,因为环必定有从后面的点指向前面的点的边。

3.一个有向无环图一定至少有一个入度为0的点。

4.拓扑排序有多种可能的序列,因为图中可能存在多个入度为零的顶点,而这些顶点可以以任意顺序加入拓扑序列。

如何求拓扑排序?(刚死去的数据结构知识来攻击我了hh

下面这个视频讲了求拓扑排序的方法,推荐看

【数据结构 图 拓扑排序】

求拓扑排序的步骤就是:找到入度为0的顶点,删掉由该顶点指出的所有边,之后,在剩余的顶点中再次找到入度为0的顶点......重复该操作。

而我们代码实现就是,用队列模拟这个过程。

代码如下 

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m;
int h[N],e[N],ne[N],idx;
int q[N],d[N];//d数组此时表示的是每个顶点的入度
void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
bool topsort()
{
    int hh=0,tt=-1;//表示队头 队尾的指针 tt初始化为-1 队列中的元素下标从0开始

    for(int i=1;i<=n;i++)//顶点用1~n表示
    {
        if(!d[i])q[++tt]=i;//入度为0就入队  
        //++tt tt始终表示的是当前队列的最后一个元素
    }
    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)q[++tt]=j;//删除顶点之后,若有顶点由此入度变为0,入队
        }
    }
    return tt==n-1;//当队列尾部的计数与顶点数相同时说明找到了一个拓扑排序

}
int main()
{
    cin>>n>>m;
    memset(h,-1,sizeof h);//初始化邻接表的顶点集

    for(int i=0;i<m;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
        d[y]++;//边由x指向y,y的入度要++
    }

    if(topsort())
    {
//数组模拟队列只是定义了队头队尾指针,通过这两个指针的移动来划定队列范围,然鹅在q数组中其实是包含所有插入的元素的。刚好我们元素插入的顺序就是拓扑序列
        for(int i=0;i<n;i++)
        {
            cout<<q[i]<<" ";
        }
    }
    else cout<<"-1"<<endl;
    return 0;
}

因为思路比较好理解,之前也写过几个bfs的题目,这里解释就比较少,之后看有需要补充的会再回来改一下。这次先写到这里~

有问题欢迎指出!一起加油!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代理IP在游戏中的作用有哪些?

游戏代理IP的作用是什么&#xff1f;IP代理软件相当于连接客户端和虚拟服务器的软件“中转站”&#xff0c;在我们向远程服务器提出需求后&#xff0c;代理服务器首先获得用户的请求&#xff0c;然后将服务请求转移到远程服务器&#xff0c;然后将远程服务器反馈的结果转移到客…

vue实践:构建高效的电子签名功能

前言 在现代数字化时代&#xff0c;电子签名成为了一种方便、高效且安全的签署文件的方式。本文将介绍电子签名的原理和实现方法&#xff0c;帮助你快速掌握这一重要的工具。 电子签名是什么&#xff1f; 电子签名是一种数字化的签名方式&#xff0c;用于验证和确认电子文档、…

ES集群节点、主从、负责均衡

集群 节点介绍 Elasticsearch的协调节点并不是master节点。在Elasticsearch集群中&#xff0c;有几种不同类型的节点&#xff0c;其中包括&#xff1a; Master节点&#xff1a;负责集群范围内的管理和控制&#xff0c;例如创建或删除索引&#xff0c;决定哪些分片分配给哪个…

vxe-table从2.0升级到3.0,vxe-table-plugin-virtual-tree虚拟滚动失效

问题&#xff1a;系统一直使用的vxe-table2.0&#xff0c;vxe-table2.0不支持树的虚拟滚动&#xff0c;为了解决这个问题&#xff0c;引入了vxe-table-plugin-virtual-tree插件&#xff0c;现在系统vxe-table升级3.0&#xff0c;vxe-table-plugin-virtual-tree的虚拟滚动失效了…

Python第三方扩展库Matplotlib

Python第三方扩展库Matplotlib Matplotlib 是第三方库&#xff0c;不是Python安装程序自带的库&#xff0c;需要额外安装&#xff0c;它是Python的一个综合性的绘图库&#xff0c;提供了大量的绘图函数用于创建静态、动态、交互式的图形和数据可视化&#xff0c;可以帮助用户创…

Android App开发-简单控件(1)——文本显示

本章介绍了App开发常见的几类简单控件的用法&#xff0c;主要包括&#xff1a;显示文字的文本视图、容纳视图的常用布局、响应点击的按钮控件、显示图片的图像视图等。然后结合本章所涉及的知识&#xff0c;完成一个实战项目“简单计算器”的设计与实现。 1.1 文本显示 本节介绍…

(九)springboot实战——springboot3下的webflux项目参数验证及其全局参数验证异常处理

前言 在上一节内容中&#xff0c;我们介绍了如何在webflux项目中自定义实现一个全局的异常处理器ErrorWebExceptionHandler&#xff0c;正常情况下其可以处理我们系统的运行时异常&#xff0c;但是无法处理参数验证的异常WebExchangeBindException&#xff0c;所以这里提供另外…

彻底解决 MAC Android Studio gradle async 时出现 “connect timed out“ 问题

最近在编译一个比较老的项目&#xff0c;git clone 之后使用 async 之后出现一下现象&#xff1a; 首先确定是我网络本身是没有问题的&#xff0c;尝试几次重新 async 之后还是出现问题&#xff0c;网上找了一些方法解决了本问题&#xff0c;以此来记录一下问题是如何解决的。 …

JavaWeb学习|Session

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 Session 1、Session 就一个接口&#xff08;HttpSession&#xff09;。 2、Session 就是会话。它是用来…

虚拟化平台、主机

虚拟化技术介绍 一、常见虚拟化技术 二、虚拟化与云计算的关系 虚拟化是什么 虚拟化是一种技术&#xff0c;就是将不可拆分的实体资源变成可以自由划分的逻辑资源&#xff0c;从而实现资源的整合、隔离、在分配&#xff0c;云计算就是利用了虚拟化技术的这个特点 云计算是…

java框架面试篇

Spring框架 spring Bean线程安全问题 Scope注解 我们可以在bean的类上加Scope注解来声明这个Bean是单个实例还是多个实例。在默认情况下Bean是单个实例的&#xff0c;此时的注解中的属性默认为Scope("singleton")&#xff0c;Scope("prototype")则是一…

BP图片降噪MATLAB代码

BP(Back Propagation)神经网络是一种常用的深度学习模型,可以用于图像降噪。主要步骤包括: 构建BP神经网络模型。包括输入层、隐藏层和输出层。输入层大小与图像大小相同,输出层大小也与输入图像大小相同。隐藏层根据图像复杂度设定。 准备训练数据。使用干净图像作为输入,加…

WIN11 - WSL(Windows Subsystem for Linux) 安装教程

前言 WSL&#xff0c;即Windows Subsystem for Linux&#xff0c;是一种在Windows操作系统上运行Linux二进制文件的兼容层。该层提供了Linux环境和GNU工具&#xff0c;可以在Windows系统上运行Linux应用程序。WSL使得开发人员可以在Windows系统上使用Linux工具和命令行界面&am…

Web自动化—Cypress 测试框架概述

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 Cypress 测试框架概述 1.1 Cypress 默认文件结构 在C…

漏洞原理远程命令执行

漏洞原理远程命令/代码执行 远程命令执行函数&#xff08;Remote Command Execution Function&#xff09;是指在一个网络环境中&#xff0c;通过远程执行命令来控制另一个计算机系统或设备的功能。 远程命令执行函数可以通过网络协议&#xff08;如SSH、Telnet、RPC等&#x…

苹果电脑哪款文件管理器好用?推荐QSpace Pro多窗格文件管理器

还在找好用的Mac文件管理器&#xff1f;苹果电脑哪款文件管理器好用&#xff1f;推荐QSpace Pro多窗格文件管理器&#xff0c;灵活且实用&#xff01; Mac软件下载安装&#xff1a;多窗格文件管理QSpace Pro 首先&#xff0c;我被QSpace的简洁和高效所吸引。它的界面设计非常清…

第九节HarmonyOS 常用基础组件13-TimePicker

1、描述 时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时以及分钟。默认以24小时的时间区间创建滑动选择器。 2、接口 TimePicker(options?: {selected?: Date}) 3、参数 selected - Date - 设置选中项的时间。默认是系统当前的时间。 4、属性…

代码随想录算法训练营第35天 | 860.柠檬水找零 + 406.根据身高重建队列 + 452.用最少数量的箭引爆气球

今日任务 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球 860.柠檬水找零 - Easy 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的…

Backtrader 文档学习-Bracket Orders

Backtrader 文档学习-Bracket Orders 1. 概述 组合订单类型是一个非常宽泛的订单类别&#xff0c;只要brokder支持的订单类型都可以&#xff0c; 包括(Market, Limit, Close, Stop, StopLimit, StopTrail, StopTrailLimit, OCO)。 该功能用于回测&#xff0c;交互broker Brac…

VBA语言専攻介绍(更新)

VBA语言専攻简介 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。我这里专注VBA&#xff0c;垂直度非常高&#xff0c;并和多个国际VBA网站&#xff08;英语系和德语系&#xff09;有互动及技术互通。您来到这里&#xff0c;就是进入到了一个绚烂的VBA世界&…