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

拓扑排序-广度优先遍历思路

本质: 【广度优先遍历 】【贪心算法】应用于【有向图】的专有名词

应用场景:任务调度,课程安排

作用

  • 得到一个不唯一的【拓扑序】
  • 检测【有向图】是否有环,使用数据【并查集】

使用:先找度为0的前驱节点,然后广度找点(把第一个前驱去掉,找其他没有前驱的节点)

题目举例:

你这个学期必须选修 numCourses 门课程,记为 0numCourses - 1

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai必须 先学习课程 bi

  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的

利用拓扑
根据依赖关系,构建邻接表ret(用来记录课程之间的关系)、入度数组ans(用来记录课程的依赖)
选取入度为 0 的数据,根据邻接表,减小依赖它的数据的入度。
找出入度变为 0 的数据,重复第 3 步(行)。
直至所有数据的入度为 0,得到排序

public boolean canFinish(int numCourses, int[][] prerequisites) {int[] ans = new int[numCourses];  // 入度数组List<List<Integer>> ret = new ArrayList<>(); // 邻接表Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < numCourses; i++) {ret.add(new ArrayList<>()); //初始化}for (int[] tmp:prerequisites) {ans[tmp[0]]++; // 这门课需要依赖 入度++ret.get(tmp[1]).add(tmp[0]); //邻接表 进行增加领接的数据}for (int i = 0; i < numCourses; i++) {if(ans[i]==0){queue.add(i); // 添加入度为0 - 即不需要进行依赖的课程}}while (!queue.isEmpty()){numCourses--; // --为后续确认是否成环判断/课程正常选完int pre = queue.poll(); //临接数据for (int cur:ret.get(pre)) {if(--ans[cur] == 0){queue.add(cur);}}}return numCourses==0;
}


http://www.mrgr.cn/news/22190.html

相关文章:

  • proxy代理解决vue中跨域问题
  • 数据结构与算法 第12天(排序)
  • VLAN配置学习笔记
  • mac m2 安装 nvm
  • 基于yolov8的肺炎检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • 【系统架构设计师】工厂方法设计模式
  • 学生心理健康评估:Spring Boot解决方案
  • 可公开的公开学习分享课
  • 《解锁 C++并发编程:高效的锁机制管理之道》
  • SprinBoot+Vue动漫交流与推荐平台的设计与实现
  • c++ vector模拟实现细节
  • C++入门基础篇
  • 2024年必看的4款录屏新星,谁才是你的菜?
  • 查ASCII码带来的MAN
  • Java——堆
  • C++ 定时器
  • C++——类与对象(二)
  • docker ps -a及docker exec -it ubuntu-01 /bin/bash
  • Qt常用控件——QPushButton
  • GEE Python案例——通过机器学习算法检测 Portonovo 和 Trave 悬崖之间的崖顶侵蚀驱动因素(意大利安科纳)