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

BFS 解决拓扑排序 , 课程表 , 课程表 II , 火星词典

文章目录

  • 拓扑排序简介
    • 1.有向无环图(DAG图)
    • 2.AOV网:顶点活动图
    • 3.拓扑排序
    • 4.实现拓扑排序
  • 207. 课程表
  • 210. 课程表 II
  • LCR 114. 火星词典

拓扑排序简介

1.有向无环图(DAG图)

像这样只能从一个点到另一个点有方向的图,并且不构成环状就是有向无环图
在这里插入图片描述
如果像这样,4,5,6就构成环状了,就不是有向无环图了。

在这里插入图片描述

出度是指一个顶点作为起点出发的边的数量,而入度是指指向该顶点的边的数量

在这里插入图片描述

2.AOV网:顶点活动图

在有向无环图中,用顶点来表示一个活动,用边来表示活动的先后顺序的图结构。

eg:

在这里插入图片描述

3.拓扑排序

找到做事情的先后顺序,拓扑排序的结果可能不是唯一的。
重要应用:判断有向图中是否有环

用上面那个炒菜的例子:

1.先把买菜拿出来(买菜没有被任何箭头指向,准备厨具也可以)

在这里插入图片描述

  1. 准备厨具和洗菜都可以拿出来

在这里插入图片描述

  1. 只能选择洗菜

在这里插入图片描述
5. 可以选择腌肉或者切菜(剩下依次类推)

在这里插入图片描述

如何排序

  1. 找出图中入度为0的点,然后输出
  2. 删除与该点连接的边
  3. 重复1,2操作,直到图中没有点或者没有入度为0的点(有可能有环)为止

4.实现拓扑排序

借助队列,来一次bfs即可

  1. 初始化,把所有入度为0的点加入队列中
  2. 当队列不为空的时候:
    a. 拿出队头元素,加入最终结果中
    b. 删除与该元素相连接的边;
    c. 判断:与删除边相连接的点,是否入度变为0(如果入度为0,就加入队列)

207. 课程表

在这里插入图片描述

由题目可的建网类似这样:
在这里插入图片描述

实际上这道题就是在问:

能否拓扑排序
是否是有向无环图 - 有向图中是否有环?

如何建图 ? 灵活的使用容器

更倾向于unordered_map<int, vector> edgs; 建表,就像0 -> 1,2,3 ,好用。
在这里插入图片描述

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {unordered_map<int,vector<int>> edges;//邻接表存图vector<int> in(numCourses); //标记每一个定义的入度//建图for(auto& e : prerequisites){int a = e[0], b =e[1]; //b -> aedges[b].push_back(a);in[a]++;}//拓扑排序  queue<int> q;//把所有入度为0的点的加入队列for(int i = 0; i<numCourses; i++){if(in[i] == 0)q.push(i);}//bfswhile(q.size()){int t = q.front();q.pop();for(auto a : edges[t]){in[a]--;if(in[a] == 0)q.push(a);}}//判断是否有环for(int i = 0; i<numCourses; i++){if(in[i])return false;}return true;}
};

210. 课程表 II

在这里插入图片描述

本质上跟上一道题一样,只不过这个让返回课程的学习顺序

我们只需要在每一次取出队列中最上面的时候,把它存入一个vector数组中即可,最后判断数组中的数和课程总数是否相等就可以。

class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {unordered_map<int,vector<int>> edgs;//邻接表存图vector<int> vis(numCourses);//标记每一个定义的入度//建表for(auto& e : prerequisites){int a = e[0],b = e[1]; //b->aedgs[b].push_back(a);vis[a]++;}//拓扑排序queue<int> q;vector<int> ret;//把所有入度为0的点放入队列for(int i = 0; i<numCourses; i++){if(vis[i] == 0)q.push(i);}while(q.size()){int t = q.front();ret.push_back(t);q.pop();for(auto a : edgs[t]){vis[a]--;if(vis[a] == 0)q.push(a);}}if(ret.size() == numCourses)return ret;else return {}; }
};

LCR 114. 火星词典

在这里插入图片描述

如何收集信息

用两层for循环来搜集信息

在这里插入图片描述
一遍一遍循环比较来建有向无环图

在这里插入图片描述

细节问题

像abc 和 ab 这种比较并不合法
在这里插入图片描述

class Solution {
public:unordered_map<char,unordered_set<char>> edges;//邻接表存图unordered_map<char,int> in; //统计入度bool valid; //处理边界情况string alienOrder(vector<string>& words) {int n = words.size();//建表+初始化入度哈希表for(auto& s : words){for(auto ch : s){in[ch] = 0;}}for(int i = 0; i<n; i++){for(int j = i+1; j<n; j++){add(words[i],words[j]);if(valid) return "";}}//拓扑排序queue<char> q;for(auto& [a,b] : in){if(b == 0) q.push(a); }    string ret;while(q.size()){char t =q.front();q.pop();ret+=t;for(char ch : edges[t]){if(--in[ch] == 0)q.push(ch);}}//判断for(auto &[a,b] : in){if(b != 0)return "";}return ret;}void add(string& s1,string& s2){int n = min(s1.size(),s2.size());int i = 0;for(;i<n;i++){if(s1[i] != s2[i]){char a = s1[i];char b = s2[i];// a -> bif(!edges.count(a) || !edges[a].count(b)){edges[a].insert(b);in[b]++;}break;}}if(i == s2.size() && i < s1.size()) //判断不合法的情况valid = true;}
};

相关文章:

BFS 解决拓扑排序 , 课程表 , 课程表 II , 火星词典

文章目录 拓扑排序简介1.有向无环图&#xff08;DAG图&#xff09;2.AOV网&#xff1a;顶点活动图3.拓扑排序4.实现拓扑排序 207. 课程表210. 课程表 IILCR 114. 火星词典 拓扑排序简介 1.有向无环图&#xff08;DAG图&#xff09; 像这样只能从一个点到另一个点有方向的图&a…...

web安全攻防渗透测试实战指南_web安全攻防渗透测试实战指南,零基础入门到精通,收藏这一篇就够了

1. Nmap的基本 Nmap ip 6 ip Nmap -A 开启操作系统识别和版本识别功能 – T&#xff08;0-6档&#xff09; 设置扫描的速度 一般设置T4 过快容易被发现 -v 显示信息的级别&#xff0c;-vv显示更详细的信息 192.168.1.1/24 扫描C段 192.168.11 -254 上 nmap -A -T4 -v -i…...

大模型如何赋能智慧城市新发展?

国家数据局近期发布的《数字中国发展报告&#xff08;2023&#xff09;》显示&#xff0c;我国数据要素市场化改革步伐进一步加快&#xff0c;数字经济规模持续壮大&#xff0c;数字技术应用场景不断拓展。这一成就的背后是数字技术广泛应用&#xff0c;数字技术不仅影响着老百…...

随记——机器学习

前言 本来有个500块钱的单子&#xff0c;用机器学习做一个不知道什么鸟的识别&#xff0c;正好有数据集&#xff0c;跑个小项目&#xff0c;过一下机器学习图像识别的流程&#xff0c;用很短的时间记录下来..... 一、数据预处理 将数据集分为训练集和测试集&#xff0c;直接…...

【在Linux世界中追寻伟大的One Piece】进程间通信

目录 1 -> 进程间通信介绍 1.1 -> 进程间通信目的 1.2 -> 进程间通信发展 1.3 -> 进程间通信分类 1.3.1 -> 管道 1.3.2 -> System V IPC 1.3.3 -> POSIX IPC 2 -> 管道 2.1 -> 什么是管道 2.2 -> 匿名管道 2.3 -> 实例代码 2.4 -…...

多路复用IO

一。进程处理多路IO请求 在没有多路复用IO之前&#xff0c;对于多路IO请求&#xff0c;一般只有阻塞与非阻塞IO两种方式 1.1 阻塞IO 需要结合多进程/多线程&#xff0c;每个进程/线程处理一路IO 缺点&#xff1a;客户端越多&#xff0c;需要创建的进程/线程越多&#xff0c…...

C++ prime plus-7-編程練習

1&#xff0c; #include <iostream>// 函数声明 double harmonicMean(double x, double y);int main() {double x, y, result;while (true) {std::cout << "请输入两个数&#xff08;其中一个为0时结束&#xff09;: ";std::cin >> x >> y;…...

计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值,打印出结果

我们写这道题的时候需要俩变量接受&#xff0c;一个总数一个分母&#xff0c;我们发现分母变化是有规律的从1~100循环。 #include<stdio.h> int main() {int i 0;int tag 1;double sum 0.0;for (i 1; i < 101; i){if (i % 2 0){sum sum - 1.0 / i;}else{sum s…...

Linux本地服务器搭建开源监控服务Uptime Kuma与远程监控实战教程

文章目录 前言**主要功能**一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址…...

JS 历史简介

目录 1. JS 历史简介 2. JS 技术特征 1. JS 历史简介 举例&#xff1a;在提交用户的注册信息的时候&#xff0c;为避免注册出现错误后重新填写信息&#xff0c;可以在写完一栏信息后进行校验&#xff0c;并提示是否出现错误&#xff0c;这样会大大提高用户提交的成功率&…...

爬虫逆向学习(七):补环境动态生成某数四代后缀MmEwMD

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 前言 这篇文章主要是研究如何动态生成后缀参数MmEwMD的&#xff0c;它是在文章爬虫逆向学习(六)&#xff1a;补环境过某数四代的基础上进行研究的&#xff0c;代码也是在它基础上增…...

光伏电站并网验收需要注意什么细节

一、设备质量及安装验收 光伏组件&#xff1a;检查光伏组件的外观是否完好无损&#xff0c;无明显的缺陷和破损&#xff0c;表面是否清洁无污染。同时&#xff0c;需要验证光伏组件的型号、参数是否与设备台账资料一致。 逆变器&#xff1a;确认逆变器具备防雷、防尘、防潮等…...

页面禁用鼠标右键属于反爬虫措施吗 ?

是的&#xff0c;禁用鼠标右键通常被视为一种反爬虫&#xff08;anti-scraping&#xff09;措施。网站开发者常常采用这种技术来防止用户通过右键菜单复制文本、图像或其他内容&#xff0c;特别是在内容保护和数据安全方面。以下是禁用鼠标右键的一些背景和目的&#xff1a; 1…...

视频理解大模型最新进展

文章目录 Video-LLaMAVision-Language BranchAudio-Language Branch Video-ChatGPTMiniGPT4-videoCogVLM2-Video&#xff08;1&#xff09;Pre-training&#xff08;2&#xff09;Post-training Qwen2-VLMA-LMMChat-UniVi大模型对比 Video-LLaMA 2023&#xff1a;阿里达摩院的…...

cocos creator 使用 protobuf 的步骤与注意事项

移除可能曾安装过的protobuf // 移除全局 npm remove -g protobufjs npm remove -g protobufjs-cli npm remove -g pbjs // 移除项目中的 npm remove --save protobufjs npm remove --save protobufjs-cli npm remove --save pbjs全局安装 npm i -g protobufjs //或者 cnpm …...

mac访达查找文件目录

mac访达查找文件目录 在Mac上使用访达&#xff08;Finder&#xff09;查找文件或目录的方法如下&#xff1a; 打开访达。 在访达窗口的侧边栏中&#xff0c;选择“ Go to Folder”&#xff08;转到文件夹&#xff09;选项&#xff0c;或者使用快捷键ShiftCommandG打开一个对…...

【数据结构】点分治 点分树

求树上长度小于等于k的路径 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 10010, M N * 2;int n, m; int h[N], e[M], w[M], ne[M], idx; //邻接表 bool st[N]; //记录每个点是否被删掉 int p[N]; //存储…...

K8s Calico替换为Cilium,以及安装Cilium过程(鲁莽版)

迁移CNI插件的3种办法&#xff1a; 1、创建一个新的集群&#xff0c;通过Gitops的方式迁移负载&#xff0c;然而&#xff0c;这可能涉及大量的准备工作和潜在的中断。 2、另一种方法是重新配置/etc/cni/net.d/指向Cilium。但是&#xff0c;现有的pod仍将由旧的…...

背景图鼠标放上去切换图片过渡效果

文章目录 css鼠标放上去之前效果鼠标放上去时效果 css <li class"message"></li>.message {width: 22px;height: 22px;background-image: url(/assets/message-01.png);background-size: cover;background-position: center;transition: background-ima…...

【Linux】当前进展

驱动层日志添加了下文件目录&#xff0c;函数&#xff0c;代码行的打印&#xff08;这里要小心&#xff0c;驱动目录源代码打印日志里边添进程号可能有问题&#xff0c;因为在驱动初始化的时候&#xff0c;内核还没有创建进程&#xff0c;不过猜测可以先不打印进程相关信息&…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...