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

拓扑排序之 leetcode 207.课程表

 原题:207. 课程表 - 力扣(LeetCode)

这是一道经典的拓扑排序题目,为理解和解决这类题目,我们首先了解下拓扑排序。

在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列,它有以下性质

(1)唯一性

当有向无环图呈线性结构(即从第一个节点到最后一个节点有一条路径连接所有节点)时,拓扑排序唯一。当图中存在多个无依赖关系的节点时,拓扑排序不唯一。

(2)时间复杂度

Kahn算法和DFS算法的时间复杂度均为O(V+E),其中V是节点数,E是边数。两种算法都能高效处理大规模图结构。

(3)环检测(这个是解题的关键)

如果算法结束后拓扑排序的节点数少于图中总节点数,说明图中存在环。这使得拓扑排序算法同时成为检测有向图是否有环的有效方法。

其他背景:

什么是度?出度?入度?

​​​​​https://zh.wikipedia.org/wiki/%E5%BA%A6_(%E5%9B%BE%E8%AE%BA)

解法:

这里主要分为两种,第一种是BFS广度优先搜索(基于入度的Kahn算法),第二种是DFS深度优先搜索。

(1)BFS

func canFinish(numCourses int, pre [][]int) bool {edges := make(map[int][]int,numCourses)indges := make([]int,numCourses)for i := range pre {p:=pre[i]edges[p[1]] = append(edges[p[1]],p[0])indges[p[0]]++}q:=[]int{}for i := range indges {if indges[i]== 0 {q = append(q,i)}   }result := []int{}for len(q)>0 {u := q[0]q=q[1:]result = append(result,u)for _,v:=range edges[u] {indges[v]--if indges[v] == 0 {q = append(q,v)}} }return len(result) == numCourses}

http://www.dtcms.com/a/273641.html

相关文章:

  • 突破分子设计瓶颈:融合bVAE与GPU伊辛机的智能优化策略
  • Tomasulo算法是什么?
  • 【DataFlow】数据合成流水线工具
  • xFile:高性能虚拟分布式加密存储系统——Go
  • uniapp制作一个个人页面
  • Java结构型模式---组合模式
  • Elasticsearch混合搜索深度解析(下):执行机制与完整流程
  • 华为VS格行VS中兴VS波导随身WIFI6怎么选?流量卡OR随身WIFI,长期使用到底谁更香?
  • 从 0 到 1 玩转 upload-labs 靶场:环境搭建 + 全关卡漏洞解析
  • 零基础入门指南:华为数通认证体系详解
  • React 核心知识点速览:从基础到关键概念
  • Redis的性能优化与监控
  • Git 常用操作与注意事项全攻略
  • 华为数据通信网络基础
  • Python 【技术面试题和HR面试题】➕ 循环结构、控制语句及综合应用问答
  • [面试] 手写题-插入排序
  • 飞算JavaAI:新一代智能编码引擎,革新Java研发范式
  • 代账行业数字化破局:从“知道”到“做到”,三步走稳赢!
  • C++学习之C++中`std::fmax`和`std::max`的区别
  • pytorch的介绍以及张量的创建
  • Java中三种重要的锁
  • spring boot 详解以及原理
  • 界面设计工具——MasterGo莫高设计
  • 【UE教程/进阶】Slate链式编辑原理
  • 解决echarts数据更新了图表不更新
  • GPU 降成本免运维,睿观 AI 助手选择函数计算
  • 打破信息壁垒!可视化如何让交通数据 “开口说话”
  • C#元组:从基础到实战的全方位解析
  • 人脸图像生成(DCGAN)
  • Qt数据库编程详解:SQLite实战指南