拓扑排序(Java实现)

news2024/11/28 0:29:51

一、基本思想

拓扑排序是一种对有向无环图(DAG)进行排序的算法,它将所有顶点排成一个线性序列,使得对于任意一条有向边(u, v),u在序列中都出现在v之前。拓扑排序的思想非常直观,就像是按照任务的先后顺序制定一个任务列表,每个任务都依赖于前面的任务完成后才能开始。

拓扑排序的算法实现主要包括两个步骤:

  1. 构造有向图:首先需要按照一定的顺序构造有向图,记录每个节点的入度(节点A指向B则称A为B的入度)。这一步可以通过遍历整个图来实现。
  2. 进行拓扑排序:从图中选择一个入度为0的顶点,输出该顶点,并从图中删除该顶点和所有以它为起点的有向边。重复这一步骤直到所有顶点均已输出,或者当前图中不存在入度为0的顶点为止。如果此时图中仍存在入度为0的顶点,则说明有向图中必然存在环,因此不可能进行拓扑排序。

拓扑排序的结果不唯一,只要满足任意一对顶点之间的先后关系即可。因此,在实际应用中,可以根据具体问题的要求选择不同的拓扑排序算法。

拓扑排序的应用范围非常广泛,在Java中拓扑排序通常用于具有依赖关系的任务调度,例如在确定任务执行的顺序、制定课程表、解决比赛日程安排等问题中都可以应用。通过拓扑排序,我们可以将复杂的问题分解为小问题,并按照一定的顺序进行解决,从而提高解决问题的效率。

什么是有向无环图?

有向无环图(Directed Acyclic Graph,DAG)是一种特殊的图,它由顶点(Vertex)和边(Edge)组成。每条边都有一个方向,从一条边的起点到终点。在有向图中,如果存在一条路径可以回到起点,那么这个图就是一个环。而有向无环图的定义就是不存在这样的环。换句话说,有向无环图是一种有向图,它无法从某个顶点出发经过若干条边回到该点。

如下图就是一个有向无环图

在这里插入图片描述

对上面这个图进行拓扑排序?

在这里插入图片描述

二、Java实现案例

案例:课程学习顺序

描述:现在你总共有 numCourses 门课需要选(课程序号从0开始,即表示0numCourses - 1的课)。给你一个数组 prerequisites ,其中 prerequisites[i] = [a, b] ,表示在选修课程 a 前 必须 先选修 b。返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。

代码实现:

public int[] findOrder(int numCourses, int[][] prerequisites) {
    if (numCourses <= 0) return new int[0];
    // 1. 构造有向图。(邻接表)存放每个节点的后继节点
    HashSet<Integer>[] adjacency = new HashSet[numCourses];
    for (int i = 0; i < numCourses; i++) {
        adjacency[i] = new HashSet<>();
    }
    // 2. 记录每个节点的入度值
    int[] inDegree = new int[numCourses];
    for (int[] p : prerequisites) {
        adjacency[p[1]].add(p[0]);
        inDegree[p[0]]++;
    }
    // 3. 将入度为0的课程加入队列
    Queue<Integer> queue = new LinkedList<>();
    for (int i = 0; i < numCourses; i++) {
        if (inDegree[i] == 0) queue.offer(i);
    }
    // 4. 拓扑排序,每次将入度为0的课程取出来放入结果集中,并将该课程的后继节点入度值-1
    int[] result = new int[numCourses];
    int index = 0; //记录当前已安排的课程数
    while (!queue.isEmpty()) {
        int course = queue.poll();
        result[index++] = course;
        for (Integer adjacentCourse : adjacency[course]) {
            inDegree[adjacentCourse]--;
            if (inDegree[adjacentCourse] == 0) {
                queue.offer(adjacentCourse);
            }
        }
    }
    // 5. 如果结果列表中的课程数不等于总课程数,说明无法完成所有课程,返回空数组
    if (index != numCourses) return new int[0];

    return result;
}

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

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

相关文章

已完结,给小白的《50讲Python自动化办公》

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯也叫这个名。 写在前面 上个周末去成都参加了第8届中国开源年会&#xff0c;认识了很多行业前辈和优秀的同龄人。 我发现在工作之外还能有一番事业的人&#xff0c;都有一个让我羡慕的共同点&#xff1a;有一个拿得出手…

Redis实战 | 使用Redis 的有序集合(Sorted Set)实现排行榜功能,和Spring Boot集成

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

LangChain+LLM实战---ChatGPT的工作原理

一个词一个词的输出 ChatGPT能够自动生成类似于人类书写的文本&#xff0c;这是非常了不起和出乎意料的。但它是如何做到的&#xff1f;为什么会有效果呢&#xff1f;我的目的在于大致概述ChatGPT内部发生了什么&#xff0c;然后探讨它为什么能够很好地生成我们认为有意义的文…

[MRCTF2020]你传你呢1

提示 只对php以及phtml文件之类的做了防护content-type.htaccess文件 这里就不整那么麻烦直接抓包测试 首先对后缀测试看过滤了哪些 (php php3 pht php5 phtml phps) 全部被ban了 到这里的后续思路通过上传一些配置文件把上传的图片都以php文件执行 尝试上传图片码, 直接上传成…

[自动化运维工具] Ansible的简单介绍与常用模块详解

文章目录 1. Ansible概述1.1 简介1.2 Ansible的特性1.3 Ansible的组件构成1.4 Ansible的工作原理 2. Ansible环境部署2.1 前置准备2.2 安装ansible2.3 查看基本信息2.4 配置远程主机清单 3. Ansible的常用模块3.1 ansible的基础命令格式3.2 Command模块3.2.1 基本格式和常用参数…

Android 10.0 系统wifi列表显示已连接但无法访问网络问题解决

1.前言 在10.0的系统产品开发中,在wifi模块也很重要,但是在某些情况下对于一些wifi连接成功后,确显示已连接成功,但是无法访问互联网 的情况,所以实际上这时可以正常上网的,就是显示的不正常,所以就需要分析连接流程然后解决问题 如图所示 2.系统wifi列表显示已连接但无…

前端滚动分页

场景 在前端开发中&#xff0c;我们经常碰到分页加载的需求&#xff0c;在PC端通常用分页组件就可以解决这种类型的场景。而当我们在移动端中&#xff0c;分页组件就显得有点不符合逻辑和正常的交互体验&#xff0c;所以滚动分页常常成为我们的一种选择&#xff0c;即页面滚动…

PostgreSQL空间地理信息postGis

PostgreSQL 数据库 PostgreSQL有各种各样的插件扩展其功能&#xff0c;其中地理信息有PostGis插件的支持&#xff0c;丰富PostgreSQL 数据库的使用功能。因此PostgreSQL 结合PostGis可以存储Geometry类型数据的点、线、面等数据&#xff0c;同时还可以结合相应的专有函数做空间…

听GPT 讲Rust源代码--library/std(11)

题图来自 Features of Rust[1] File: rust/library/std/src/sys/itron/time.rs 在Rust源代码中&#xff0c;rust/library/std/src/sys/itron/time.rs文件是用于实现与ITRON操作系统相关的时间功能。ITRON是一种实时操作系统&#xff0c;被广泛用于嵌入式系统中。这个文件中定义…

ps5计时计费管理系统软件怎么使用教学,佳易王PS5体验馆计时收费管理倒计时提醒软件试用下载

ps5计时计费管理系统软件怎么使用教学&#xff0c;佳易王PS5体验馆计时收费管理倒计时提醒软件试用下载 每台机子可以自由设置倒计时提醒的时间&#xff0c;到了时间后&#xff0c;电脑会发出语音提醒同时改变颜色双重提醒方式。也可以在中途关闭提醒或更改提醒时间。每个机子可…

Pycharm安装配置Pyqt5教程(保姆级)

目录 一、前言 1、依赖包 2、工具 二、安装依赖包 三、配置环境 四、配置设计工具 1、Qt Designer 2、PyRcc 3、PyUIC 五、使用 1、界面设计 2、ui文件转化为py文件 一、前言 很多情况下需要为程序设计一个GUI界面&#xff0c;在Python中使用较多的用户界面设计工具…

图像新型拼接

道路摄像头拼接 拼接道路上的摄像头&#xff0c;比较麻烦&#xff0c;如图所示 前后的摄像头都是如此&#xff0c;那么如何拼接摄像头画面呢&#xff0c;像下面这样拼接 测试代码 测试一下代码&#xff0c;使用python import cv2 import numpy as npimg cv2.imread("…

python 成绩统计,输出及格率和优秀率

题目描述&#xff1a; 小蓝给学生们组织了一场考试&#xff0c;卷面总分为100分&#xff0c;每个学生的得分都是一个0到100的整数。 如果得分至少是60分&#xff0c;则称为及格。如果得分至少为85分&#xff0c;则称为优秀。 请计算及格率和优秀率&#xff0c;用百分数表示&am…

【算法训练营】最近公共祖先+求最大连续bit数

算法 1.最近公共祖先求最大连续bit数 1.最近公共祖先 题目链接 【题目解析】&#xff1a; 最近公共祖先表示距离两个节点最近的公共父节点&#xff0c;这道题考察二叉树。【解题思路】&#xff1a; 题目所描述的满二叉树如下&#xff1a; 1 / \ 2 3 / \ / \ 4 5 6 7 上述树中…

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义&#xff0c;两地指的是两个城市&#xff1a;同城&#xff0c;异地。三中心指的是三个数据中心&#xff1a;生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统&#xff0c;双中心具备相当的业…

25.3 MySQL 多表查询

1. 排序 ORDER BY子句用于对查询结果进行排序. 它可以按照一个或多个列的值进行升序或降序排序.在SELECT语句中, ORDER BY子句应该位于结尾, 其基本语法如下: SELECT 字段1, 字段2, ... FROM 表名 ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC], ...其中, ASC(ascend): 表…

ardupilot开发 --- gdb 篇

环境 win11 vscode 1.81.0 wsl2 ardupilot 利用gdb工具在vsCode中实现 Ardupilot SITL的断点调试 优点&#xff1a;可在vsCode中实现断点调试。 参考文献&#xff1a;https://ardupilot.org/dev/docs/debugging-with-gdb-using-vscode.html 安装gdb工具 打开wsl&#xff0…

项目实战:新增@Controller和@Service@Repository@Autowire四个注解

1、Controller package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited public interface Controller { }2、Service package com.csdn.mymvc.annotation; import java.lang.annotation.*…

文献阅读:LONGNET: Scaling Transformers to 1,000,000,000 Tokens

文献阅读&#xff1a;LONGNET: Scaling Transformers to 1,000,000,000 Tokens 1. 文章简介2. 方法原理 1. 方法思路2. Dilated Attention 1. 具体原理2. 多头实现3. 复杂度分析 3. 训练方法 3. 实验结果4. 结论 & 思考5. 参考链接 文献链接&#xff1a;https://arxiv.org…

onlyoffice 去除:连接器(connector) 表单填(Filling out the form)限制 可使用jsApi级别操作文档

阅读须知&#xff1a;本文针对有对word/excel进行js操作的需求 本次改造基于V7.3.3进行&#xff0c;已经更新进入docker。 小伙伴们须知&#xff1a;改造后的office docker需要付费&#xff08;875元&#xff09;&#xff0c;等于wps一个月费用 欢迎大家一起交流&#xff1a;V&…