Java实现拓扑排序算法的示例代码

下面将详细讲解Java实现拓扑排序算法的示例代码的完整攻略。

什么是拓扑排序?

拓扑排序是一种常用的有向无环图(DAG)的排序算法。拓扑排序的思想是将DAG中的节点按照拓扑关系排成一个序列,使得对于任何一个节点,它的前驱节点都排在它的前面。

拓扑排序算法实现

拓扑排序算法实现的主要步骤如下:

  1. 构建图的邻接表;
  2. 统计每个节点的入度;
  3. 将入度为0的节点入队;
  4. 不断从队首取出节点并把它的出边的终点的入度减1,若发现节点的入度为0则加入队列;
  5. 直到队列为空,如果处理的节点数不足图中的节点数则说明图中有环。

下面给出Java实现的示例代码:

import java.util.*;

public class TopologicalSort {
    public List<Integer> topoSort(int n, int[][] edges) {
        List<Integer> res = new ArrayList<>();

        // 构建图的邻接表
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }
        for (int[] e : edges) {
            graph.get(e[1]).add(e[0]);
        }

        // 统计每个节点的入度
        int[] indegree = new int[n];
        for (int[] e : edges) {
            indegree[e[0]]++;
        }

        // 将入度为0的节点入队
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (indegree[i] == 0) {
                queue.offer(i);
            }
        }

        // 不断从队首取出节点并把它的出边的终点的入度减1,
        // 若发现节点的入度为0则加入队列
        while (!queue.isEmpty()) {
            int u = queue.poll();
            res.add(u);
            for (int v : graph.get(u)) {
                if (--indegree[v] == 0) {
                    queue.offer(v);
                }
            }
        }

        // 如果处理的节点数不足图中的节点数则说明图中有环
        if (res.size() < n) {
            return new ArrayList<>();
        }

        return res;
    }
}

示例说明:

  1. 构建图的邻接表:在上述示例中,我们使用了一个长度为n+1的List来保存图的邻接表,其中下标从0到n的位置分别表示0到n号节点,List的每个位置表示该节点的出边的终点。
  2. 统计每个节点的入度:在上述示例中,通过遍历每一条边来统计节点的入度。
  3. 将入度为0的节点入队:在上述示例中,我们使用了一个Queue来保存所有入度为0的节点。
  4. 不断从队首取出节点并把它的出边的终点的入度减1:在上述示例中,我们通过遍历队首节点的所有出边,并减少它们的终点节点的入度,如果某个节点的入度为0,则将该节点加入队列。
  5. 如果处理的节点数不足图中的节点数则说明图中有环:最后检查返回的结果数组的长度是否为节点数n,如果不是则说明图中存在环路。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现拓扑排序算法的示例代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MyBatis下SQL注入攻击的3种方式

    以下是MyBatis下SQL注入攻击的3种方式。 1.参数拼接 如下面的语句: @Select("SELECT * FROM user WHERE username = ‘" + username + "’ AND password = ‘" + password + "’") 其中 usernam…

    Java 2023年5月20日
    00
  • 使用BufferedReader读取本地文件的操作

    以下是使用BufferedReader读取本地文件的完整攻略。大致步骤如下: 创建BufferedReader对象和FileReader对象; 使用FileReader对象读取文件,将数据存储在BufferedReader缓存中; 读取缓存中的数据,直到结束; 关闭BufferedReader对象和FileReader对象。 具体实现的代码如下: 步骤一:创…

    Java 2023年5月19日
    00
  • Java操作文件输出为字符串以及字符串输出为文件的方法

    对于Java操作文件输出为字符串以及字符串输出为文件的方法,可以分为两个部分进行讲解。 Java操作文件输出为字符串 Java操作文件输出为字符串可以通过以下步骤完成: 打开文件并读取文件内容。 将文件内容转化为字符串。 关闭文件并返回字符串。 以下是Java代码示例: public static String readFile(String filePat…

    Java 2023年5月26日
    00
  • 入门java的第一步HelloWorld

    下面是“入门Java的第一步HelloWorld”的完整攻略: 步骤一:安装Java开发工具 在进行Java编程前,需要安装Java开发工具,例如Eclipse、NetBeans等。本文以Eclipse为例进行讲解。 Eclipse下载地址:https://www.eclipse.org/downloads/ 下载后双击exe文件进行安装,安装完成后启动Ec…

    Java 2023年5月19日
    00
  • Java实现两个随机数组合并进行排序的方法

    为了实现Java中两个随机数组合并的排序方法,我们可以分为以下步骤进行: 第一步 – 定义随机数组 在Java中,我们需要定义两个随机数组,并实现随机数生成器。以下是一个基于Java8的示例代码: import java.util.Random; public class RandomArrayGenerator { public int[] generat…

    Java 2023年5月26日
    00
  • Java多线程之Park和Unpark原理

    Java多线程中的Park和Unpark是线程同步关键字,常用于线程间等待和通知的操作。在本次攻略中,将深入讲解Park和Unpark的实现原理,并提供两条示例说明。 Park和Unpark的基本概念 Park和Unpark是Java多线程中用于实现线程等待和通知机制的一对关键字。 其中,Park的作用是使线程等待,将其挂起,并将线程的状态设置为WAITIN…

    Java 2023年5月19日
    00
  • java 字符串截取的实例详解

    Java 字符串截取的实例详解 在 Java 中,字符串截取是一个很常见的操作,它可以通过字符串的索引来实现。本篇文章将详细讲解 Java 字符串截取的实现方法和相关注意事项。 常用的方法 Java 字符串的截取可以使用 String 类的 substring() 方法,它有两个重载版本,分别是: public String substring(int be…

    Java 2023年5月26日
    00
  • Maven打包跳过测试的实现方法

    下面我就为您详细讲解”Maven打包跳过测试的实现方法”,请您耐心阅读。 前置条件 在开始介绍跳过测试的实现方法之前,您需要满足以下条件: 您的项目需要使用Maven进行构建。 您已经在项目中定义了单元测试,并通过了相应的测试用例。 Maven跳过测试的实现方法 方法一:命令行指令 在使用Maven打包时,可以使用以下命令来跳过测试: mvn clean p…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部