图论
方法1:BFS+入度
public boolean canFinish(int numCourses, int[][] prerequisites) {
//1.计算入度表,[u,v] v->u
//入度(indegree)就是有向图中指向这个点的边的数量,即有向图的某个顶点作为终点的次数和
int[] indegrees = new int[numCourses];
for (int[] p : prerequisites) {
indegrees[p[0]]++;
}
//2.将入度为0的点放入queue中,queue中装的是点的下标索引,即是入度表中的索引
//题意:你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。课程名称与索引是对应的
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < indegrees.length; i++) {
if (indegrees[i] == 0) queue.offer(i);
}
//3.轮转这个queue,这个queue中弹出的节点其实是v->u中的v
//弹出一个节点,将课程数-1,在prerequisites中找到这个节点的指向节点,即通过v->u
//如果u找到了,将其入度-1,如果入度为0了,将其加到queue中
while (!queue.isEmpty()) {
int pre = queue.poll();//这个是v->u的v
numCourses--;
for (int[] p : prerequisites) {
if (p[1] != pre) continue;
indegrees[p[0]]--;
if (indegrees[p[0]] == 0) queue.offer(p[0]);
}
}
//判断有没有剩余的课程数
return numCourses == 0;
}概念
拓扑排序
一些概念

方法1:BFS+邻接矩阵
方法2:BFS+邻接表
方法1:排序+BFS
方法2:Dijkstra 算法
方法1:BFS
方法1:01广度优先搜索
方法2:Dijkstra
方法3:Dijkstra

附
方法1:邻接表+DFS
方法2:DFS
方法1:模拟
方法3:拓扑排序
方法1:01-BFS
方法2:01BFS
Last updated