📜  用于拓扑排序的Java程序(1)

📅  最后修改于: 2023-12-03 15:27:11.081000             🧑  作者: Mango

用于拓扑排序的Java程序

简介

拓扑排序是一种重要的图论算法,用于将有向无环图(DAG)的节点进行排序。该算法常常被应用于任务调度、依赖关系分析等领域。本文介绍一款用于拓扑排序的Java程序,可以方便地对DAG进行排序。

实现思路
  1. 定义一个int数组inDegrees来记录每个节点的入度(即有多少条边指向该节点)。
  2. 将所有入度为0的节点加入一个队列中。
  3. 每次从队列中取出一个节点,将其加入拓扑排序结果集中。
  4. 对该节点的所有邻居节点的入度进行更新,即inDegrees[j]--。
  5. 如果邻居节点的入度变成了0,将其加入队列中。
  6. 重复步骤3至5,直到队列为空。
代码实现

下面是一个用Java实现拓扑排序的代码段:

import java.util.*;

public class TopologicalSort {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        int[] inDegrees = new int[numCourses];
        List<Integer>[] adj = new ArrayList[numCourses];
        
        for (int i = 0; i < numCourses; i++) {
            adj[i] = new ArrayList<Integer>();
        }
        
        for (int[] edge : prerequisites) {
            inDegrees[edge[0]]++;
            adj[edge[1]].add(edge[0]);
        }
        
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
            if (inDegrees[i] == 0) {
                queue.offer(i);
            }
        }
        
        int[] res = new int[numCourses];
        int index = 0;
        while (!queue.isEmpty()) {
            int cur = queue.poll();
            res[index++] = cur;
            for (int neighbor : adj[cur]) {
                inDegrees[neighbor]--;
                if (inDegrees[neighbor] == 0) {
                    queue.offer(neighbor);
                }
            }
        }
        
        return index == numCourses ? res : new int[0];
    }
}
使用示例

以下是一个示例程序,使用上述拓扑排序算法对给定的有向无环图进行排序:

public class Main {
    public static void main(String[] args) {
        int numCourses = 4;
        int[][] prerequisites = {{1,0},{2,0},{3,1},{3,2}};
        TopologicalSort ts = new TopologicalSort();
        int[] res = ts.findOrder(numCourses, prerequisites);
        System.out.println(Arrays.toString(res));
    }
}

输出:

[0, 1, 2, 3]
总结

本文介绍了一款用于拓扑排序的Java程序。通过对每个节点的入度进行记录,并使用队列进行遍历,可以高效地进行排序。建议开发者可以更详细地了解该算法的实现原理,在实际应用中加以运用。