拓扑排序针对的是有向无环图,有向无环图的特点就是从任意一个顶点出发,都无法回到原来的位置,也就是不存在自回闭路。那如何证明一个图是不是有向无环图,书里说用拓扑排序,也就是拓扑排序成功则是,反之不是。
经典例题:https://leetcode.cn/problems/course-schedule/
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//有环就是错的
//计算每个点的入度。
int[] degree = new int[numCourses];
//构建图,存放课程之间的关系
int[][] tu = new int[numCourses][numCourses];
for(int[] p : prerequisites) {
tu[p[0]][p[1]] = 1;
degree[p[1]]++;
}
int count = numCourses;
//创建队列,找到并添加入度为0的节点
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < numCourses; i++) {
if(degree[i] == 0) {
queue.add(i);
count--;
}
}
//图搜索
while(!queue.isEmpty()) {
Integer i = queue.poll();
for(int j = 0; j < numCourses; j++) {
if(tu[i][j] == 1) {
degree[j]--;
if(degree[j] == 0) {
queue.add(j);
count--;
}
}
}
}
return count == 0;
}
}
优化:二维数组改为List
>,也就是采用邻接表
暂时不贴代码