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

拓扑排序 学习笔记

拓扑排序 学习笔记

学习日期: 2026-05-12
前置知识: BFS + 队列 + 入度概念


问题场景

有 n 门课,每门课有先修要求。请排出上课顺序,让每门课的预修课都在前面。

微积分(1) → 线代(2) → 概率论(4)↓                    ↓高数(3)  ───────────→  机器学习(6)↑计概(5)

核心思想

入度 = 被几条边指着。

入度为 0 的点 → 没有前置依赖 → 可以直接上

完整过程图解

初始:课:   1   2   3   4   5   6入度:  0   1   1   1   0   2入度为0 → 1和5 → 入队━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━第1步: q = [1, 5]弹出 1: 删掉 1→2, 1→32的入度 1→0 ✓ 入队3的入度 1→0 ✓ 入队弹出 5: 删掉 5→66的入度 2→1order = [1, 5]q = [2, 3]入度:  0   0   0   1   0   1━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━第2步: q = [2, 3]弹出 2: 删掉 2→44的入度 1→0 ✓ 入队弹出 3: 删掉 3→66的入度 1→0 ✓ 入队order = [1, 5, 2, 3]q = [4, 6]━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━第3步: q = [4, 6]弹出 4: 删掉 4→6(6入度已经是0,不变)弹出 6: 无出边order = [1, 5, 2, 3, 4, 6]q = []len(order) = 6 == n → 排序成功 ✓━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━结果: 1 5 2 3 4 6  (多种答案均可)验证每条边是否从左指向右:1→2 ✓ 1→3 ✓ 2→4 ✓ 3→6 ✓ 4→6 ✓ 5→6 ✓

环检测

若存在环,如 2→4 且 4→2:初始: 2入度=1, 4入度=1第1步处理后: 2入度=1, 4入度=1  ← 永远≥1环上的点永远进不了队列!q 为空 → while 退出 → len(order) < n → 有环

不会死循环。 队列为空自动退出,不会无限跑。


模板代码

from collections import dequen, m = map(int, input().split())g = [[] for _ in range(n + 1)]
indeg = [0] * (n + 1)               # 入度数组for _ in range(m):u, v = map(int, input().split())  # u → vg[u].append(v)indeg[v] += 1# 入度为0的点入队
q = deque([i for i in range(1, n + 1) if indeg[i] == 0])
order = []while q:u = q.popleft()                # 弹出队首order.append(u)                # 加入结果for v in g[u]:                 # 删除出边indeg[v] -= 1if indeg[v] == 0:          # 入度归零则入队q.append(v)# 判断
if len(order) < n:print("有环,无法拓扑排序")
else:print(*order)

关键要点

要点 说明
入度 一个点被几条边指着
入队条件 入度为 0
删边 遍历 u 的邻居,入度减 1
环检测 len(order) < n 说明有环
多种答案 入度为 0 的点顺序任意,全正确
复杂度 O(n + m)
http://www.jsqmd.com/news/803886/

相关文章:

  • CoPaw:本地部署的AI助手工作站,打造个人专属智能工作流
  • 2026年防漏卫生巾推荐:理性选购的高口碑品牌指南 - 产业观察网
  • 如何让TypeScript错误提示更友好:pretty-ts-errors的终极优化方案
  • 基于Apache Kafka构建企业级多AI智能体协作系统:KafClaw架构与实践
  • 湖州自建房靠谱施工队权威推荐TOP1:包工包料包设计包建造15857294490 - 新闻快传
  • 2026年上海留学中介,收费透明机构哪家是最好的 - 速递信息
  • 终极Marko组件化开发指南:单文件与多文件组件最佳实践
  • 免费开源硬件监控工具:LibreHardwareMonitor完整指南 [特殊字符]
  • 小白程序员必看:收藏这份AI黑话指南,轻松入门大模型世界!
  • LyricsX:一站式macOS歌词同步解决方案,让音乐体验更智能
  • 英雄联盟玩家的效率革命:告别手动操作,拥抱智能游戏体验
  • CheapClaw:基于阶段性思考与历史截断的多智能体成本优化框架
  • 别被手册骗了!STM32F411CEU6(UFQFPN48封装)到底有几个串口?手把手教你查引脚、测硬件
  • 凰标:每一份国风创作都被尊重、被看见@凤凰标志
  • 上海静安婚内赠与财产维权律师:上海专业帮原配打官司律师/上海专门对付小三的律师/上海专门帮原配告小三的律师/上海免费咨询原配起诉小三/选择指南 - 优质品牌商家
  • 南充工厂搬迁技术拆解:南充同城搬家、南充大型搬家、南充居民搬家、南充店铺搬迁、南充搬家打包、南充搬迁、南充正规的搬家选择指南 - 优质品牌商家
  • 2026年安徽二手PCB设备回收与整厂搬迁完全指南 - 优质企业观察收录
  • 终极免费PDF转SVG工具:简单3步完成高质量转换
  • 告别安装器!用CMD一行命令搞定Office 2016专业增强版激活(附KMS服务器地址)
  • 3分钟掌握APK Installer:Windows上最高效的Android应用安装终极方案
  • LibreHardwareMonitor:你的电脑健康管家,硬件监控从此无忧
  • 从DDR3到JESD204B:深入拆解FPGA高速串行接收链路上的ISERDESE2核心角色
  • 2026年上海留学机构评估,家长信赖的211背景机构深度解析 - 速递信息
  • 用Python分析深圳企业摄影市场:从大众点评数据看行业格局|数据可视化实战
  • Java 内部类结构与底层内存模型剖析
  • 从“能装上”到“可复现”:Python 团队如何正确使用 requirements.txt、锁定文件与依赖分组
  • CSV的使用方法介绍
  • 团队协作标注避坑指南:如何用Docker和Conda管理Labelme环境,杜绝‘lineColor’报错
  • 从零到一:基于C#与ArcGIS二次开发构建迎风面指数计算插件实战
  • 人生问题变得 可测量的庖丁解牛