拓扑排序是一种对有向无环图(DAG)进行排序的算法,其结果是一个线性序列,满足以下条件:对于图中的每一条有向边(u, v),顶点u在序列中都出现在顶点v之前。拓扑排序常用于任务调度、课程安排等场景。
以下是一个简单的Java实现拓扑排序的代码示例:
import java.util.*;
public class TopologicalSort {
private int V; // 顶点数
private LinkedList<Integer>[] adj; // 邻接表
// 构造函数
public TopologicalSort(int v) {
V = v;
adj = new LinkedList[v];
for (int i = 0; i < v; ++i) {
adj[i] = new LinkedList();
}
}
// 添加边
void addEdge(int v, int w) {
adj[v].add(w);
}
// 拓扑排序函数
void topologicalSortUtil(int v, boolean visited[], Stack<Integer> stack) {
visited[v] = true;
Integer i;
for (Integer neighbor : adj[v]) {
if (!visited[neighbor]) {
topologicalSortUtil(neighbor, visited, stack);
}
}
stack.push(new Integer(v));
}
// 打印拓扑排序结果
void topologicalSort() {
Stack<Integer> stack = new Stack<>();
boolean visited[] = new boolean[V];
for (int i = 0; i < V; i++) {
visited[i] = false;
}
for (int i = 0; i < V; i++) {
if (visited[i] == false) {
topologicalSortUtil(i, visited, stack);
}
}
while (stack.empty() == false) {
System.out.print(stack.pop() + " ");
}
}
public static void main(String args[]) {
TopologicalSort g = new TopologicalSort(6);
g.addEdge(5, 2);
g.addEdge(5, 0);
g.addEdge(4, 0);
g.addEdge(4, 1);
g.addEdge(2, 3);
g.addEdge(3, 1);
System.out.println("拓扑排序结果:");
g.topologicalSort();
}
}
在这个示例中,我们首先创建了一个TopologicalSort
类,包含一个顶点数V
和一个邻接表adj
。然后实现了添加边的方法addEdge
,以及拓扑排序的核心方法topologicalSortUtil
和topologicalSort
。最后在main
方法中创建了一个实例并调用topologicalSort
方法进行拓扑排序。