207. 课程表

- 日理万妓 2023-02-23 08:53 135阅读 0赞

题目:

207. 课程表
在这里插入图片描述

题解:拓扑排序 + 广度优先搜索

在这里插入图片描述
在这里插入图片描述
1. 无向图及其邻接表:
在这里插入图片描述
2. 有向图及其邻接表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 解释一:

在这里插入图片描述
在这里插入图片描述

2. 解释二:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:拓扑排序 + 广度优先搜索

  1. import java.util.*;
  2. public class code207 {
  3. // 边缘列表 prerequisites 【后置结点,前置结点】
  4. public static boolean canFinish(int numCourses, int[][] prerequisites) {
  5. int inDegree[] = new int[numCourses]; // 入度表,标记每个结点的入度
  6. //1、构建邻接表
  7. List<List<Integer>> adj = new ArrayList<>(); // 课程安排图的 邻接表
  8. for(int i = 0; i < numCourses; i++)
  9. {
  10. List<Integer> temp = new ArrayList<>();
  11. adj.add(temp); // 初始化入度以及邻接表
  12. }
  13. // 2、填写邻接表与入度表,获取每个课程的入度和邻接关系
  14. for(int p[]: prerequisites) // 课程前置条件列表 prerequisites
  15. {
  16. inDegree[p[0]]++; //填充入度,统计数组的每一行的开头第一个数字,在入度表里找到这个数字的下标 + 1
  17. adj.get(p[1]).add(p[0]); //填充邻接表,有向图的邻接表为俩个数[start,end],这里取下标为start
  18. }
  19. // System.out.println(adj.toString());
  20. Queue<Integer> queue = new LinkedList<>();
  21. // 3、将所有入度为0的结点加入队列(加入队列的是结点的下标)
  22. for(int i = 0; i < numCourses; i++)
  23. {
  24. if(inDegree[i] == 0)
  25. {
  26. queue.add(i);
  27. }
  28. }
  29. // 记录已经出队的课程数量
  30. int cnt = 0;
  31. // 4、类似广度优先遍历的写法
  32. while(!queue.isEmpty()) // 只要队列非空
  33. {
  34. int top = queue.poll(); // 从队首取出入度为 0 的结点
  35. cnt += 1;
  36. // 遍历当前出队结点的所有后继结点,将它们的入度减 1
  37. for(int cur: adj.get(top))
  38. {
  39. inDegree[cur]--; // 将这个结点的所有邻接结点(它指向的结点)的入度减 1
  40. if(inDegree[cur] == 0)
  41. {
  42. queue.add(cur); // 在减 1 以后,如果这个被减 1 的结点的入度为 0 ,就继续入队。
  43. }
  44. }
  45. }
  46. // 当队列为空的时候,检查结果集中的顶点个数是否和课程数相等即可。
  47. return cnt == numCourses;
  48. }
  49. public static void main(String[] args) {
  50. int numCourses = 6;
  51. int prerequisites[][] = { { 3, 0 }, { 3, 1 }, { 4, 1 }, { 4, 2 }, { 5, 3 }, { 5, 4 } };
  52. boolean res = canFinish(numCourses, prerequisites);
  53. System.out.println(res);
  54. }
  55. }

参考:

  1. 课程表(拓扑排序:入度表BFS法 / DFS法,清晰图解)
  2. 【图解】手把手打通拓扑排序
  3. C++ 98.32% 简洁易懂的课程表:拓扑排序
  4. 拓扑排序、深度优先遍历
  5. 详细通俗的思路分析,多解法
  6. 拓扑排序C++实现
  7. 图的几种表示方法
  8. 算法与数据结构(2)——图的表示法与常用的转化算法

发表评论

表情:
评论列表 (有 0 条评论,135人围观)

还没有评论,来说两句吧...

相关阅读

    相关 207.课程表

    打卡!!!每日一题 今天给大家分享一道拓扑排序的问题,本题也是一道经典的「拓扑排序」问题,通过这道题也顺便帮大家拓展一下拓扑排序的知识。 题目描述: > 你这个学期必须选

    相关 拓扑排序-leetcode207课程表

    现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: \[