拓扑排序(课程顺序113)
拓扑排序
1. 拓扑排序的定义
拓扑排序:无环,含有依赖的有向图
算法实现:
1. 统计每个点的入度,以及所有的连边
2. 将入度为0的点放入队列
3.从队列中取出一个点,将其连边的入度-1
4. 一旦有新的入度为0的点,放入队列中,重复3-4
则队列出队的顺序就是拓扑排序。
2. 案例
题目:课程顺序
现在总共有 numCourses 门课需要选,记为 0 到 numCourses-1。
给定一个数组 prerequisites ,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i] = [ai, bi] 表示想要学习课程 ai ,需要先完成课程 bi 。
请根据给出一个可行的修课序列。
输入: numCourses = 2, prerequisites = [[1,0]]
输出: [0,1]
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1]
题解
求拓扑排序的结构,拓扑排序的模板如下:
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
Queue<Integer> queue = new ArrayDeque<>();
Map<Integer, List<Integer>> map = new HashMap<>();
int book[] = new int[numCourses], index = 0, res[] = new int[numCourses];
for (int i = 0; i < prerequisites.length; i++) {
int later = prerequisites[i][1];
int first = prerequisites[i][0];
book[first]++;
map.putIfAbsent(later, new ArrayList<>());
map.get(later).add(first);
}
for (int i = 0; i < numCourses; i++) {
if (book[i] == 0) {
queue.add(i);
}
}
while (!queue.isEmpty()) {
int temp = queue.poll();
res[index++] = temp;
if (map.get(temp) != null) {
for (int num : map.get(temp)) {
book[num]--;
if (book[num] == 0) queue.add(num);
}
}
}
return index==numCourses?res:new int[0];
}
}