用java语言编写一个拓扑排序
时间: 2023-09-14 19:14:11 浏览: 96
可以使用Java中的队列实现拓扑排序,具体代码如下:
```java
import java.util.*;
public class TopologicalSort {
public static void main(String[] args) {
int N = 5;
int[][] graph = new int[][] {{1, 3}, {3, 2}, {4, 2}, {4, 5}};
int[] inDegree = new int[N + 1];
List<List<Integer>> adjList = new ArrayList<>();
for(int i = 0; i <= N; i++) {
adjList.add(new ArrayList<Integer>());
}
for(int[] pair: graph) {
adjList.get(pair[0]).add(pair[1]);
inDegree[pair[1]]++;
}
Queue<Integer> queue = new LinkedList<>();
for(int i = 1; i <= N; i++) {
if(inDegree[i] == 0) {
queue.offer(i);
}
}
List<Integer> result = new ArrayList<>();
while(!queue.isEmpty()) {
int node = queue.poll();
result.add(node);
for(int adj: adjList.get(node)) {
inDegree[adj]--;
if(inDegree[adj] == 0) {
queue.offer(adj);
}
}
}
if(result.size() != N) {
System.out.println("Graph has a cycle!");
} else {
System.out.println("Topological Sort: " + result.toString());
}
}
}
```
这段代码中,我们使用邻接表来存储图,用数组 `inDegree` 来存储每个节点的入度。算法的核心是通过 queue 依次取出入度为 0 的节点,将其加入结果列表中,并且更新其相邻节点的入度。如果结果列表的长度不等于节点个数,说明图中存在环。
阅读全文