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

算法 之 拓 扑 排 序

文章目录

  • 拓扑排序,常用于这个课程表安排类型的,对于一个抽象为一个有向无环图,经过排序之后,排序之后的元素x,y,仍然保持着在原来的有向无环图当中,x->y,也就是前后的顺序仍然不变

灵神讲解

  • 讲一下拓扑排序的思路:
    • 首先输入的是一个边的关系edges[i] = [x,y]表示,存在x->y的有向边,我们需要将这个边,使用邻接表存储起来,同时还使用一个数组存储每一个顶点的入度数量
    • 使用一个队列来存储候选将要拓展的节点,当然一开始,加入队列的元素就是入度为0的节点
    • 选取队列中的元素,加入最终的排序的数组中,同时,对于以该元素作为起始节点的边所对应的节点的入度数量应该-1,同时判断,将新的入度数量为0的节点加入候选队列当中
    • 如果最终,排序的元素数量少于总的节点数量,则说明存在环
// 返回有向无环图(DAG)的其中一个拓扑序
// 如果图中有环,返回空列表
// 节点编号从 0 到 n-1
vector<int> topologicalSort(int n, vector<vector<int>>& edges) {vector<vector<int>> g(n);vector<int> in_deg(n);for (auto& e : edges) {int x = e[0], y = e[1];g[x].push_back(y);in_deg[y]++; // 统计 y 的先修课数量}queue<int> q;for (int i = 0; i < n; i++) {if (in_deg[i] == 0) { // 没有先修课,可以直接上q.push(i); // 加入学习队列}}vector<int> topo_order;while (!q.empty()) {int x = q.front();q.pop();topo_order.push_back(x);for (int y : g[x]) {in_deg[y]--; // 修完 x 后,y 的先修课数量减一if (in_deg[y] == 0) { // y 的先修课全部上完q.push(y); // 加入学习队列}}}if (topo_order.size() < n) { // 图中有环return {};}return topo_order;
}
http://www.dtcms.com/a/342094.html

相关文章:

  • LeetCode 回文链表
  • 桥梁设计模式
  • RabbitMQ事务消息原理是什么
  • RabbitMQ:延时消息(死信交换机、延迟消息插件)
  • 领域专用AI模型训练指南:医疗、法律、金融三大垂直领域微调效果对比
  • 28、工业网络资产漏洞扫描与风险评估 (模拟) - /安全与维护组件/industrial-network-scanner
  • 深度解析Atlassian 团队协作套件(Jira、Confluence、Loom、Rovo)如何赋能全球分布式团队协作
  • Whisk for Mac 网页编辑器 PHP开发
  • 牛客:链表的回文结构详解
  • NewsNow搭建喂饭级教程
  • SQL中对视图的操作命令汇总
  • STM32H750 CoreMark跑分测试
  • [最新]Dify v1.7.2版本更新:工作流可视化和节点搜索
  • 2025 年 8 月《GPT-5 家族 SQL 能力评测报告》发布
  • SQL视图、存储过程和触发器
  • OBCP第四章 OceanBase SQL 调优学习笔记:通俗解读与实践指南
  • CentOS 7安装FFmpeg
  • QT QProcess, WinExec, ShellExecute中文路径带空格程序或者脚本执行并带参数
  • Qt实现TabWidget通过addTab函数添加的页,页内控件自适应窗口大小
  • Qt文件压缩工具项目开发教程
  • 【Bug】CentOS 7 使用vim命令报错vim: command not found
  • 开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑
  • Elasticsearch官方文档学习-未完待续
  • java项目:如何优化JVM参数?
  • 【深入理解 Linux 网络】收包原理与内核实现(下) 从 TCP 传输层到应用
  • 遥感机器学习入门实战教程|Sklearn案例⑤:集成学习方法全览
  • ES_flattened
  • Nacos部署微服务
  • Python机器学习入门:用scikit-learn构建你的第一个预测模型
  • 安装nvtop编译报错:fatal error: linux/kcmp.h: No such file or directory