算法系列--BFS解决拓扑排序

💕"请努力活下去"💕
作者:Lvzi
文章主要内容:算法系列–算法系列–BFS解决拓扑排序
在这里插入图片描述

大家好,今天为大家带来的是算法系列--BFS解决拓扑排序

前言:什么是拓扑排序
拓扑排序–解决有顺序的排序问题(要做事情的先后顺序)
在这里插入图片描述
几个基本概念

  1. 有向无环图:有方向,但是不存在环路
  2. 入度:有多少条路可以走到当前节点
  3. 出度:从当前节点出发,有多少条线路

拓扑排序问题的思路比较固定,难点在于灵活的采用不同的容器去建图和表示每个节点的入度信息,下面是拓扑排序问题的步骤:

Step1:建图

建立一个有向图来表示做事情的先后顺序

如何建图–灵活使用语言提供的容器

要存储的是:一个节点与其所相连的节点(边),两点构成一条线段
建立映射关系:
–哈希表存储
Map<Point,List< Point >>

表示每一个节点的入度:
我们是根据入度是否为0来决定先后顺序的

一个节点的入度就是有多少个指向该节点的边

使用数组int[] in表示

在这里插入图片描述

Step2.进行拓扑排序(队列 + bfs)

  1. 将所有入度为0的节点添加进队列
    在这里插入图片描述

  2. 循环队列

    • 获取头结点t,将t添加进入最后的结果之中(如果要表示的话)
    • 将与t相连的边删除–等价于将与t相连的点的入度减1
    • 判断与t相连的点的入度是否为0,如果为0,表示是新的起点,添加进队列之中
  3. 直到图中没有节点或者没有入度为0的节点(有环)
    在这里插入图片描述

注意有环的情况
在这里插入图片描述

一.课程表

题目链接:课程表
在这里插入图片描述

分析:

拓扑排序

  • 如果最后存在入度不为0的点–证明有环–无法按照p数组的顺序完成课程
  • 全为0,证明可以完成所有课程

代码:

class Solution {// 本题节点就是所有的可成public boolean canFinish(int n, int[][] p) {// 1.建图Map<Integer,List<Integer>> edges = new HashMap<>();int[] in = new int[n];for(int i = 0; i < p.length; i++) {int a = p[i][0], b = p[i][1];// b->aif(!edges.containsKey(b)) // 处理为空edges.put(b,new ArrayList<>());edges.get(b).add(a); // 建立关系in[a]++;// 入度加1}// 2.拓扑排序Queue<Integer> q = new LinkedList<>();for(int i = 0; i < n; i++)// 将所有入度为0的点添加进入队列if(in[i] == 0)q.add(i);// bfs// 得到对头元素 -- 删除与其相连的边 -- 找到下一个起始位置while(!q.isEmpty()) {int t = q.poll();for(int i : edges.getOrDefault(t,new ArrayList<>())) {// 将与t相连的点的入度减1in[i]--;if(in[i] == 0) q.add(i);// 如果入度为0,表示新的起点,添加进队列}}// 判断是否存在入度不为0 的点,如果存在,证明有环,则无法完成所有课程,返回falsefor(int i : in)if(i != 0) return false;return true;}
}

总结:

  1. 注意本题p数组的指向,是b指向a
  2. 大致的过程很简单
    • 建图:建立点与点之间的联系(Map),统计所有点的入度情况–循环遍历即可
    • 拓扑排序:先将所有入度为0的点添加进入队列(起点),bfs循环遍历
  3. 一定要注意我们建的图可能有环,也可能无环,如果有环,最后图中一定有入度不为0的节点

二.课程表II

题目链接:课程表II
在这里插入图片描述

分析:

和上一道题目相同 只需记录排序结果即可

代码:

import java.util.Collections;
class Solution {public int[] findOrder(int n, int[][] p) {// 1.建图Map<Integer,List<Integer>> edges = new HashMap<>();int[] in = new int[n];for(int i = 0; i < p.length; i++) {int a = p[i][0], b = p[i][1];// b->aif(!edges.containsKey(b)) // 处理为空edges.put(b,new ArrayList<>());edges.get(b).add(a); in[a]++;// 入度加1}// 2.拓扑排序Queue<Integer> q = new LinkedList<>();for(int i = 0; i < n; i++)// 将所有入度为0的点添加进入队列if(in[i] == 0)q.add(i);int[] ret = new int[n];int index = 0;// bfswhile(!q.isEmpty()) {int t = q.poll();ret[index++] = t;for(int i : edges.getOrDefault(t,new ArrayList<>())) {// 将与t相连的点的入度减1in[i]--;if(in[i] == 0) q.add(i);// 如果入度为0,表示新的起点,添加进队列}}return index == n ? ret : new int[]{};}
}

三.⽕星词典

题目链接:⽕星词典
在这里插入图片描述

分析:

这里面的节点就是一个一个字符,题目最终要求的是字符的先后顺序–拓扑排序
三步:建图,拓扑排序,判断

在这里插入图片描述

代码:

class Solution {Map<Character,List<Character>> edges = new HashMap<>();// 建图使用Map<Character,Integer> in = new HashMap<>();// 统计每一个节点的入度信息public String alienOrder(String[] words) {// 初始化入度信息for(String str : words)for(int i = 0; i < str.length(); i++)in.put(str.charAt(i),0);// 建图  使用两层for循环来搜集信息int n = words.length;for(int i = 0; i < n - 1; i++) {for(int j = i + 1; j < n; j++) {String s1 = words[i], s2 = words[j];int len = Math.min(s1.length(),s2.length()), index = 0;while(index < len && s1.charAt(index) == s2.charAt(index))index++;// 处理不合法的情况  s1 = abc  s2 = abif(index == s2.length() && index < s1.length()) return "";// 走到两个字符串不相同的字母if(index >= len) continue;// 防止越界char prev = s1.charAt(index), behind = s2.charAt(index);if(!edges.containsKey(prev))edges.put(prev,new ArrayList<>());if(!edges.get(prev).contains(behind)) {// 这里不加if判断也行,加了是为了减少冗余信息的加入edges.get(prev).add(behind);in.put(behind,in.get(behind) + 1);}}}// 2.拓扑排序StringBuffer ret = new StringBuffer();Queue<Character> q = new LinkedList<>();for(char ch : in.keySet()) // 将度为0的节点添加进队列之中if(in.get(ch) == 0) q.add(ch);while(!q.isEmpty()) {char t = q.poll();ret.append(t);// 遍历相连的点for(char ch : edges.getOrDefault(t,new ArrayList<>())) {in.put(ch,in.get(ch) - 1);if(in.get(ch) == 0) q.add(ch);}}// 判断是否存在入度不为0的点for(char ch : in.keySet()) if(in.get(ch) != 0) return "";return ret.toString();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/685332.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算导论(2)---云计算基础

文章目录 1. 分布式计算2. 分布式计算系统架构3. 分布式计算关键技术4. 分布式计算性能优化方法5. 云计算的基本概念6. 云计算的关键技术 1. 分布式计算 1. 定义&#xff1a;分布式计算是一种计算方法&#xff0c;将一个大型任务拆分成多个小任务&#xff0c;并分配给多台计算机…

解决 Git拉取代码和本地代码丢失问题

git拉取代码&#xff0c;本地写的代码全部为空了&#xff0c;当时都蒙了&#xff0c;最后解决办法是找到对应文件的历史记录 举例&#xff1a;以本地的demo举例&#xff0c;不管是否有git或svn控制&#xff0c;都可以找到历史记录 解决办法&#xff1a; 1、对代码丢失的文件 …

LearnOpenGL(十一)之光源

一、投光物 将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 二、平行光 当一个光源处于很远的地方时&#xff0c;来自光源的每条光线就会近似于互相平行&#xff0c;我们可以称这些光为平行光。当我们使用一个假设光源处于无限远处的模型时&#xff0c;它就被称为定向…

Excel——项目管理,设置时间到期自动提醒及颜色高亮

效果图 第一步、自动获取合同到期日期 1、首先合同【签约日期】和【到期日期】下面的数据必须是日期格式&#xff0c;不能是其它的格式否则无法计算&#xff0c;如果是其它格式需要转换成标准的日期格式&#xff0c;如下图所示。 2、在“到期日期”下面的第一个单元格中输入公…

【初阶数据结构】顺序表OJ题讲解

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录与初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前&#xff0c;先了解一下声波的概念以及超声波和声波之间的关系 什么是声波&#xff1f; 声波是物体机械振动状态&#xff08;或能量&#xff09;的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式&#xff0c;这种振动状…

新手小白入门股指期货必懂的知识点

股指期货&#xff0c;正式名称为股票价格指数期货&#xff0c;也被称作股价指数期货或期指&#xff0c;它是一种以股票指数为基础资产的标准化期货合约。 股指期货就像是一场关于股票指数的赌局。比如你和朋友打赌&#xff0c;比如你们赌的是“上证50指数”&#xff08;就是上海…

Xinstall助力App地推监测,实现精准效果评估

在移动互联网时代&#xff0c;App的推广已经成为企业营销的重要手段。然而&#xff0c;如何有效地监测App地推效果&#xff0c;一直是广告主和开发者面临的难题。幸运的是&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;为广告主和开发者提供了一站式的解决…

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

企业如何做好数据安全治理?

在数字化时代&#xff0c;数据成为企业运营的核心资产&#xff0c;数据安全治理成为企业管理的重要组成部分。良好的数据安全治理不仅能保护企业信息不受侵犯&#xff0c;还能有效提升企业的运营效率和市场竞争力。下面是企业如何做好数据安全治理的几个关键步骤&#xff1a; 1…

【dnSpy】通过IL指令添加try catch语句

原始代码 我们需要将整体代码添加try catch语句 步骤 添加代码的保护区域&#xff0c;也就是{ } 获取Exception.Message方法 添加callvirt指令 添加提示框 添加call指令 最后让消息框显示 编译完点击确定即可 添加后的IL指令代码详解 如果看不清楚联系作者 参考文档 ht…

锚索测力计在岩土工程中的应用

随着现代工程建设的快速发展&#xff0c;岩土工程安全问题日益受到人们的关注。岩土工程中的锚索结构&#xff0c;作为保证工程稳定和安全的关键部分&#xff0c;其性能监测和评估显得尤为重要。近年来&#xff0c;锚索测力计作为一种先进的监测工具&#xff0c;在岩土工程安全…