题目

现在你总共有 n 门课需要选,记为 0 到 n-1。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?

示例 1:

输入: 2, [[1,0]]

输出: true

解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

示例 2:

输入: 2, [[1,0],[0,1]]

输出: false

解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。

说明:

输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。

你可以假定输入的先决条件中没有重复的边。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/course-schedule

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  • 拓扑排序。

    • 数据结构:构建邻接表;入度数组;并使用队列维护待处理的入度为0的顶点;因为此处不需要拓扑序列,所以维护一个待放入拓扑序列顶点数即可,最后若待处理顶点数==0则说明可拓扑排序无环。
    • 做BFS,当队列不空:删掉入度为0的点,删掉该点出去的所有边;更新pointCnt;更新入度数组,将新的入度为0的点入队。
  • 此外,次题不考虑重边,输入的int[][] prerequisites 矩阵每一行存了一条弧的起点和终点。

相关

图的表示方法

1.邻接矩阵:矩阵m[i][j]表示i到j是否有弧/权重。有稀疏问题。

2.临接表:对图的每个节点,用一个单向链表列出从该节点出发的所有弧,链表中每个节点对应于一条出弧。

3.关联矩阵:矩阵每一行是一个点,每一列是描述一个弧(1表示弧的起点,-1表示弧的终点)。有稀疏问题。

4.弧表示法

5.星型表示法

很好的参考文章:https://blog.csdn.net/woaidapaopao/article/details/51732947

拓扑序列与拓扑排序

  • AOV网:通常,把顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。

  • 在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列(Topological order),由AOV网构造拓扑序列的过程叫做拓扑排序(Topological sort)。

  • 拓扑排序的另一个重要作用是可以判断有向图是否无环

拓扑排序算法流程(同时可以用来判断有向图是否无环)

当还有入度为0的点未放入结果序列:

  • 1 选择一个入度为0的顶点并放入结果序列尾

  • 2 从网中删除此顶点及所有出边。

    结束后,若结果集中未包含全部点(即产生入度不为0的点无法放入),则说明图中有环,否则结果序列就是一个拓扑序列。

代码

	public boolean canFinish(int numCourses, int[][] prerequisites) {
int pointCnt = numCourses;// 未放入拓扑序列的点的个数
HashMap<Integer, List<Integer>> adjList = new HashMap<>();// 邻接表
int[] inDegree = new int[numCourses];// 存放顶点入度
LinkedList<Integer> pointQue = new LinkedList<>();// 存放当前待处理的入度为0的顶点 for (int[] edge : prerequisites) {
// 初始化邻接表
List<Integer> tempList = adjList.getOrDefault(edge[0], new LinkedList<>());
tempList.add(edge[1]);
adjList.put(edge[0], tempList); // 初始化顶点入度数组
inDegree[edge[1]]++;
} // 入度为0的点放入队列
for (int i = 0; i < numCourses; ++i) {
if (inDegree[i] == 0) {
pointQue.addLast(i);
}
} // 删掉入度为0的点,删掉关联的所有边;更新pointCnt;更新入度数组,将新的入度为0的点入队。
while (!pointQue.isEmpty()) {
int u = pointQue.removeFirst();
pointCnt--;
if (adjList.containsKey(u)) {//
for (int v : adjList.get(u)) {
inDegree[v]--;
if (inDegree[v] == 0) {
pointQue.push(v);
}
}
}
} return pointCnt == 0;
}

参考链接

https://blog.csdn.net/qq_41713256/article/details/80805338

[LeetCode] 207. 课程表(拓扑排序,BFS)的更多相关文章

  1. LeetCode编程训练 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  2. Java实现 LeetCode 207 课程表

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

  3. C#LeetCode刷题-拓扑排序

    拓扑排序篇 # 题名 刷题 通过率 难度 207 课程表   40.0% 中等 210 课程表 II   39.8% 中等 329 矩阵中的最长递增路径   31.0% 困难 ​​​​​​​

  4. Leetcode 207.课程表

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

  5. [LeetCode] 207 Course Schedule_Medium tag: BFS, DFS

    There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...

  6. leetcode 207课程表

    class Solution { public: bool canFinish(int numCourses, vector<vector<int>>& prerequ ...

  7. LeetCode 207. Course Schedule(拓扑排序)

    题目 There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have p ...

  8. LeetCode:课程表【207】

    LeetCode:课程表[207] 题目描述 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹 ...

  9. 拓扑排序(附LeetCode题目)

    算法期中考到一题关于拓扑序的题目,觉得很值得一写. 1.什么是拓扑序? 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面.要注意的是,这是对有向 ...

随机推荐

  1. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  2. SpringSecurity权限管理系统实战—六、SpringSecurity整合jwt

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  3. xpath和css选择器对比

    基本语法对比 都可以在html中提取内容,但xpath可以提取xml的内容.

  4. Centos7查看端口占用

    (1)netstat -lnp|grep 50090 如果提示没有netstat命令,可需要安装:yum -y install net-tools (2) lsof -i:50090 参考链接:lin ...

  5. Jmeter 常用函数(31)- 详解 __iterationNum

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 获取当前线程的循环次数,跟线程组属性挂 ...

  6. Spring注解驱动开发01(组件扫描使用详解)

    使用Spring注解代替XML的方式 以前都是通过xml配bean的方式来完成bean对象放入ioc容器,即使通过@Aotuwire自动装配bean,还是要创建一个xml文件,进行包扫描,显得过于繁琐 ...

  7. SwitchyOmega 配置

    1.google 扩展程序里面的chrome 网上应用店里面安装Proxy SwitchyOmega 2.新建情景模式 3.配置代理 4.自动切换添加新建的情景模式,最后保存

  8. ping通网关 ping不通dns

    一.Request Timed Out 当Ping指定的对象时,出现“Request Timed Out”提示信息的频率非常高,这说明对方无法接受发送过来的数据.当然这种情况下,很可能就是网络出现了故 ...

  9. idea 推送jar包到maven私库

    1.推送到本地仓库 idea直接install即可 2.推送到公司私库 2.1 使用配置公司仓库地址的setting文件 <?xml version="1.0" encodi ...

  10. 如何使用SPSSAU计算耦合协调度?

    什么是耦合协调度模型 耦合协调度模型用于分析事物的协调发展水平.耦合度指两个或两个以上系统之间的相互作用影响,实现协调发展的动态关联关系,可以反映系统之间的相互依赖相互制约程度.协调度指耦合相互作用关 ...