拓扑排序,广度优先

2023-11-20

使用一个队列来进行广度优先搜索。初始时,所有入度为 0 的节点都被放入队列中,它们就是可以作为拓扑排序最前面的节点,并且它们之间的相对顺序是无关紧要的。

在广度优先搜索的每一步中,取出队首的节点 u:

  •     将 u 放入答案中;
  •     移除 u 的所有出边,也就是将 u 的所有相邻节点的入度减少 1。如果某个相邻节点 v 的入度变为 0,那么就将 v 放入队列中。

在广度优先搜索的过程结束后。如果答案中包含了这 n 个节点,那么就找到了一种拓扑排序,否则说明图中存在环,也就不存在拓扑排序了。

    /**
     * 课程表 II,拓扑排序,宽度优先
     * @param numCourses 课程数
     * @param prerequisites
     * @return
     */
    public static int[] findOrder(int numCourses, int[][] prerequisites){
        int[][] edges = new int[numCourses][numCourses];    // 邻接矩阵存储有向图
        int[] inDeg = new int[numCourses];      // 各顶点入度
        int[] result = new int[numCourses];     // 结果
        int index = 0;
        for (int i = 0; i < prerequisites.length; i++) {    // 初始化
            int a1 = prerequisites[i][0], a2 = prerequisites[i][1];
            edges[a2][a1] = 1;
            inDeg[a1]++;
        }
        Deque<Integer> queue = new LinkedList<>();  //队列
        for (int i = 0; i < numCourses; i++) {
            if (inDeg[i] == 0){
                queue.add(i);   //入度为0的入队
            }
        }
        while (!queue.isEmpty()){
            int u = queue.poll();
            result[index++] = u;
            for (int i = 0; i < numCourses; i++) {
                if(edges[u][i] == 1){
                    inDeg[i]--;     // 以u为起始的,入度减一
                    if(inDeg[i] == 0)
                        queue.add(i);
                }
            }
        }
        if(index != numCourses){    // 有环,无解
            return new int[0];
        }
        return result;  //无环,返回结果,结果不唯一
    }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拓扑排序,广度优先 的相关文章

  • iOS weak关键字实现原理

    在iOS中 使用weak关键字能够对内存对象进行弱引用 基于这个特性 使用weak关键字能够解决许多问题 例如delegate中对象的循环持有问题 Block对对象的强引用导致的对象无法及时释放问题 为何weak关键字能够实现对内存对象的弱
  • 第二章 Scala变量和数据类型

    目录 一 注释 二 变量和常量 一 注释 1 基本语法 1 单行注释 2 多行注释 3 文档注释 2 案例实操 3 代码规范 1 使用一次 tab 操作 实现缩进 默认整体向右边移动 用 shift tab 整体向左移 2 或者使用 ctr
  • 指针(初识指针)史上最简单的认识指针

    本章重点 指针是什么 指针和指针类型 野指针 指针运算 指针和数组 二级指针 指针数组 指针是什么 在计算机科学中 指针是编程语言中的一个对象 利用地址 它的值直接指向存在电脑存储器中另一个地方的值 由于通过地址能找到所需的变量单元 可以说
  • 44_C++_试定义一个处理学生信息的类Student,包含学号、成绩、姓名等数据成员(学号不能相同)【难点:涉及到了类数组的地址、以及类数组的地址传递】

    题目 难点 Student s new Student 3 类数组的定义 s i set num sorce name 给类数组设置参数的时候 类似于给数组对应下标赋值 这里类数组中的 每个元素都是一个类 包含类中的一切信息 Student
  • 天池时间序列竞赛——AI助力精准气象和海洋预测学习笔记其一:赛题分析

    序 最近参加了天池的气象和海洋预测竞赛 希望能够借此机会学习时间序列的相关模型 接下来会通过系列博客记录并梳理自己在竞赛过程中的一些心得体会 作为系列学习笔记的第一章 这篇文章旨在梳理和分享我对赛题的一些理解 1 项目背景 问题陈述 这个竞
  • 二进制安全学习路线

    文章目录 更新状态 黑客成长日记 二进制安全学习精髓 The Journey part 0x0 Pogramming Part 0x1 Vuln research basics Part 0x2 Diving to the deep wat
  • MATLAB算法实战应用案例精讲-【回归算法】岭回归(Ridge Regression)(附MATLAB、Python和R语言代码)

    目录 前言 几个高频面试题 1 岭回归中alpha值的选取 2 如何解决过拟合和欠拟合问题
  • Query 聚类

    为了提高阅读体验 请移步到 Query 聚类 背景 搜索系统优化长尾 query 想了解一下长尾 query 长什么样 大体上都有几类 最好能归类 一类一类处理 Query 数据源 包含 什么 怎么 如何 关键词的 Query K mean
  • 数大雁(暴力解法)

    题目描述 一群大雁往南飞 给定一个字符串记录地面上的游客听到的大雁叫声 请给出叫声最少由几只大雁发出 具体的 1 大雅发出的完整叫声为 quack 因为有多只大雁同一时间嘎嘎作响 所以字符串中可能会混合多个 quack 2 大雁会依次完整发
  • windows7系统下mysql的安装(windows10同理)[]

    1 下载mysql安装包 我这里具体的版本是5 5 40的版本 win7 win10通用的 百度网盘永久链接如下 链接 https pan baidu com s 1lEYiWuflZZfFJiRQZtZLyg 提取码 k5sn 2 安装m
  • idea git详细使用

    https blog csdn net dreamsky boy article details 84098775
  • 【算法竞赛宝典】排名次

    算法竞赛宝典 排名次 题目描述 代码展示 代码讲解 题目描述 代码展示 求名次 include
  • MyBatis学习笔记整理详细

    MyBatis笔记 写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也
  • STM32F103C8t6程序下载

    一 下载程序之前了解的内容 STM32英文手册下载 https www stmcu org cn document list index category 158 STM32的芯片上有两个管脚BOOT0和BOOT1 这两个管脚在芯片复位时的
  • 【NAS工具箱】Drop Path介绍+Dropout回顾

    前言 Drop Path是NAS中常用到的一种正则化方法 由于网络训练的过程中常常是动态的 Drop Path就成了一个不错的正则化工具 在FractalNet NASNet等都有广泛使用 Dropout Dropout是最早的用于解决过拟
  • 华为OD机试 - 最大社交距离(Java)

    题目描述 疫情期间需要大家保证一定的社交距离 公司组织开交流会议 座位一排共 N 个座位 编号分别为 0 N 1 要求员工一个接着一个进入会议室 并且可以在任何时候离开会议室 满足 每当一个员工进入时 需要坐到最大社交距离 最大化自己和其他
  • 第22章:python自动化——关键字驱动加Excel数据驱动案例

    目录 一 整个案例的要求 二 案例结构的设计 1 web keys py文件的内容 2 test data文件夹中excel测试用例数据准备 3 excel read py文件的内容 4 conf存放日志及其他的相关配置项 5 在main
  • scala判断类型

    isInstanceOf只能判断对象是否为指定类及其子类对象 而不能精确判断对象就是指定类的对象 如果要求精确的判断出对象的类型就是指定的数据类型 那么就只能用getClass和classOf来实现 对象 getClass可以精确获取对象的
  • 同学会后离婚观念的罪魁是什么?

    author skate time 2009 01 12 今天在网上看到这样一篇报道 老婆参加一次同学聚会 竟要离婚 现在的社会发展很快 可人们心理的适应能力没有跟上 换个角度想 这就是人的本性 不满足 就看自己怎么利用它 它是一把双刃剑
  • vscode的搜索技巧

    文章目录 vscode的搜索 搜索的方法 只搜索某些类型的文件 vscode在搜索的时候排除一些文件 vscode在搜索的目录中临时排除掉一些文件 在搜索中使用 ignore文件排除目录和文件 vscode的搜索 搜索的方法 只搜索某些类型

随机推荐