当前位置: 首页 > news >正文

【LeetCode 207】课程表(有向无环图 DAG、拓扑排序)

题面:

在这里插入图片描述
Link:LeetCode 207 课程表

思路:

首先很容易想到如果图中存在有向环,则表示这个环里的课是没法学习的(因为环里的课都在等待自己的前置课被学习)。
例如: 0 → 1 → 2 → 0 0\rightarrow1\rightarrow2\rightarrow0 0120

简单用拓扑排序的思想解释一下:容易想到只有 入度为 0 的顶点(课)是可以一开始就直接学习的。如果有顶点 u u u 被遍历了( u u u 课程被学习了),其指向的所有邻接点的入度就可以减一(邻接点的前置课 u u u 已经学习了,因此 u u u 对它们已经没有约束了)。

因此,只有 有向无环图(DAG) 才是合法的。
有个性质:能拓扑排序的图一定是有向无环图(DAG),有向无环图一定能拓扑排序。

DAG的判断一般就两种方法:

  1. 用入度搞个拓扑排序
  2. 可以直接 DFS 判断是否存在 有向环,对图进行一遍 DFS,在得到的 DFS 树上看看有没有连向祖先的非树边(返祖边)。如果有的话,那就有环了。简单来说,直接判断 DFS 的搜索过程中是否有结点被二次遍历了,有就是出现环了。

代码:

拓扑排序:

bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<int> d(numCourses, 0);vector<vector<int>> edges(numCourses);for(const auto& edge : prerequisites) {edges[edge[1]].emplace_back(edge[0]);++ d[edge[0]];}int visited = 0;queue<int> q;for(int i = 0; i < numCourses; ++i)if(!d[i])q.push(i);while(!q.empty()) {++visited;int u = q.front(); q.pop();for(const auto& v : edges[u]) {--d[v];if(!d[v]) q.push(v);}}return visited == numCourses;
}

DFS判断环:

class Solution {
private:vector<vector<int>> edges;vector<int> visited;bool valid = true;public:void dfs(int u) {visited[u]=true;if(!valid) return ;for(const auto &v : edges[u]) {if(visited[v] == 1) {valid = false;return ;}if(valid && !visited[v]) dfs(v);}visited[u]++;return ;}bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {edges.resize(numCourses, vector<int>());visited.resize(numCourses, false);for(const auto &edge : prerequisites) edges[edge[1]].emplace_back(edge[0]);for(int i=0;i<numCourses && valid;i++)if(!visited[i])dfs(i);return valid;}
};
http://www.dtcms.com/a/251947.html

相关文章:

  • 【Android】输入路由
  • 器件(九)—对设计的模块进行双脉冲仿真
  • 134-135Elements-UI组件库
  • 仿muduo库实现并发服务器
  • hot100 -- 13.堆系列
  • android CALL 之 RIL、TELEDCOM、PHONE
  • SpringCloud Alibaba场景实践(Nacos篇)
  • c++ algorithm常用算法汇总
  • 13分钟讲解主流Linux发行版
  • 数据库优化实战分享
  • 设备健康管理系统搭建全技术解析:从架构设计到智能运维实践
  • Flink CDC MySQL 时区相差 8 小时问题优雅解决方式
  • 华为OD机试-考勤信息-双指针(JAVA 2025B卷)
  • 第五章:执行计划分析 - 读懂MySQL的执行策略
  • Nginx 配置中·IP地址变量
  • leetcode148-排序链表
  • SimpleQtLogger 使用总结
  • Nginx全面深入学习目录
  • 我的JavaWeb软件开发作品学生信息管理系统项目/JavaWeb软件开发 课程考察标准
  • OmniMeetProTrack 全维会议链智能追录系统——山东大学软件学院创新实训项目博客(六)
  • 零基础学前端-传统前端开发(第四期-JS基础-语法,语句)
  • 【SQLAlchemy系列】 SQLAlchemy 中的多条件查询:or*与 in*操作符
  • 【Docker基础】Docker核心概念:命名空间(Namespace)之PID详解
  • java+vue+SpringBoo旅游网(程序+数据库+报告+部署教程+答辩指导)
  • Spring-ai 1.0.0 学习(二)——最小化样例
  • 网络安全相关概念与技术详解
  • C++ 网络编程(12)利用单例逻辑实现逻辑类
  • Arthas 全面学习指南
  • 如何用AI绘画工具创作出属于你的拉布布(泡泡玛特)形象?
  • K-Means算法详细解析:从原理到实践