BFS解决拓扑排序(3题)

目录

拓扑排序

1.如何排序?

2.如何形成拓扑排序 

3.如何建图

1.看数据稠密度

2. 根据算法流程灵活建图

1.课程表

2.课程表2

3.火星词典


拓扑排序

找到做事情的先后顺序,拓扑排序的结果可能不是唯一的

1.如何排序?

1.找出图中入度为0的点,然后输出

2.删除与该点连接的边

3.重复1.2操作,直到图中没有点   或者   图中没有度为0的点为止(因为有可能有环)

2.如何形成拓扑排序 

 借助队列,来一次bfs即可

1.初始化:把所有入度为0的点加入队列中即可

2.当队列不为空的时候:

a.拿出队头元素,加入到最终结果中

b.删除与该元素相连的边

c.判断 与删除边相连的点,是否入度变成0

如果入度为0,加入到队列中

3.如何建图

我们应该灵活使用stl里面的容器

 

 

1.看数据稠密度

我们可以用邻接矩阵和邻接表

邻接表我们可以使用vector嵌套vector,也可以使用哈希表,其中哈希表比较通用一些。

 

2. 根据算法流程灵活建图

 比如要统计每个节点的入度 我们用一个vector<int> 来统计

1.课程表

 207. 课程表 - 力扣(LeetCode)

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        //1.准备工作
        unordered_map<int, vector<int>> edges;//邻接表存图
        vector<int> in(numCourses); // 标记每一个定义的入度

        //2.建图
        for(auto& e: prerequisites)
        {
            int a = e[0];
            int b = e[1];
            edges[b].push_back(a);
            in[a]++;
        }

        //3.拓扑排序
        queue<int> q;
        //a.把所有入度为0的点加入到队列中
        for(int i = 0; i < numCourses; i++)
        {
            if(in[i] == 0)q.push(i);
        }
        //b.bfs
        while(q.size())
        {
            int t = q.front();
            q.pop();

            for(int a: edges[t])
            {
                in[a]--;
                if(in[a] == 0)q.push(a);
            }
        }

        //4.判断是否有环
        for(int i = 0; i < numCourses; i++)
        {
            if(in[i])return false;
        }
        return true;
    }
};

2.课程表2

LCR 113. 课程表 II - 力扣(LeetCode)

只需要在pop的时候把相应元素加入数组中即可

class Solution {
public:
    vector<int> findOrder(int n, vector<vector<int>>& prerequisites) {
        unordered_map<int, vector<int>> hash;
        vector<int> in(n,0);
        vector<int> ret;
        vector<int> ret2;
        for(auto e:prerequisites)
        {
            int a = e[0];
            int b = e[1];//b->a
            hash[b].push_back(a);
            in[a]++;
        }

        queue<int> q;
        for(int i = 0; i < n; i++)
        {
            if(in[i] == 0)q.push(i);
        }

        while(q.size())
        {
            int t = q.front();
            ret.push_back(t);
            q.pop();
            for(auto e: hash[t])
            {
                in[e]--;
                if(in[e] == 0)q.push(e);
            }
        }

        for(auto e: in)
        {
            if(e)return ret2;
        }
        return ret;
    }
};

3.火星词典

LCR 114. 火星词典 - 力扣(LeetCode) 

如何搜集信息?两层for循环

拓扑排序

1.建图

我们采用两层哈希嵌套hash<char, hash<char>> edges.

2.统计入度信息

hash<char, int> in

必须要初始化, 不然刚开始的时候找不到入度为0的值。(遍历一下每个字符串即可)

3.如何收集信息

双指针

4.细节问题

一些特殊子串一定是排在对应字符串前面的

出现下面这种情况 我们直接返回空

class Solution {
    unordered_map<char, unordered_set<char>> edges;//邻接表存储图
    unordered_map<char, int> in; //统计入度
    bool cheak; // 处理边界情况
public:
    string alienOrder(vector<string>& words) {
        //1.初始化哈希表 + 建图
        for(auto& s: words)
        {
            for(auto ch : s)
            {
                in[ch] = 0;
            }
        }

        int n = words.size();
        for(int i = 0; i < n; i++)
        {
            for(int j = i + 1; j < n; j++)
            {
                add(words[i], words[j]);
                if(cheak)return "";
            }
        }

        //2.拓扑排序
        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);
            }
        }

        //3.判断
        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->b
                if(!edges.count(a) || !edges[a].count(b))
                {
                    edges[a].insert(b);
                    in[b]++;
                }
                break;
            }
        }
        if(i == s2.size() && i < s1.size())cheak = true;
    }
};

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

区块链技术:Facebook 重塑社交媒体信任的新篇章

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着社交平台的快速发展&#xff0c;隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据&#xff0c;这种模…

机器学习-关于线性回归的表示方式和矩阵的基本运算规则

最近在学习机器学习的过程中&#xff0c;发现关于线性回归的表示和矩阵的运算容易费解&#xff0c;而且随着学习的深入容易搞混&#xff0c;因此特意做了一些研究&#xff0c;并且记录下来和大家分享。 一、线性模型有哪些表示方式&#xff1f; 器学习中&#xff0c;线性模型…

安宝特方案 | AR助力制造业安全巡检智能化革命!

引言&#xff1a; 在制造业中&#xff0c;传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案&#xff0c;通过增强现实AR技术&#xff0c;重塑制造业安全巡检模式&#xff0c;以标准化作业流程为核心&#xff0c;全面提升效率、质量与…

【deepseek】利用deepseek+cherry构建高效本地知识库

项目简介 本项目旨在开发一个高效、准确且用户友好的智能问答系统。该系统利用先进的向量化技术和深度学习模型来理解和回答用户的提问。通过整合多个模块的功能&#xff0c;系统能够从大量结构化或非结构化的数据中快速找到相关信息&#xff0c;并以自然语言的形式提供答案。…

小程序实现消息订阅通知完整实践及踩坑记录

1. 实现效果预览 2. 实现步骤 2.1 模版配置 进入小程序后端,选用一次性订阅模版,没有关键字的需要进行2-5天审核,提前进行 2.2 后端核心代码实现 import com.alibaba.fastjson2.JSONObject

vue学习4

1.自定义创建项目 2.ESlint代码规范 正规的团队需要统一的编码风格 JavaScript Standard Style 规范说明&#xff1a;https://standardjs.com/rules-zhcn.html 规则中的一部分&#xff1a; (1)字符串使用单引号 ‘aabc’ (2)无分号 const name ‘zs’ (3)关键字后加空格 if(n…

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容&#xff1a; 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法&#xff0c;模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性&#xff0c;比如容易陷入局部最优&#xff0c;收敛速度慢等&#xff0c;所以改进型的GWO可能通过不同的策略来优化这些…

最短路径问题-------Dijkstra算法

定义&#xff1a; Dijkstra(迪杰斯特拉)算法是计算单源最短路径算法&#xff0c;用于计算一个结点到其他所有结点的最短路径。该算法以源点为起始点&#xff0c;不断更新其他点到已经确定距离结点的距离&#xff0c;选取距离最小的结点加入S集合&#xff0c;直到S集合存放有所…

Deepseek-v3 / Dify api接入飞书机器人go程序

准备工作 开通了接收消息权限的飞书机器人&#xff0c;例如我希望用户跟飞书机器人私聊&#xff0c;就需要开通这个权限&#xff1a;读取用户发给机器人的单聊消息 im:message.p2p_msg:readonly准备好飞书机器人的API key 和Secretdeepseek-v3的api keysecret&#xff1a;http…

Cherry Studio:一站式多模型AI交互平台深度解析 可配合大模型搭建私有知识库问答系统

Cherry Studio&#xff1a;一站式多模型AI交互平台深度解析 可配合大模型搭建私有知识库问答系统 大模型本地化部署流程可查看文章 3分钟教你搭建属于自己的本地大模型 DeepSeek Cherry Studio地址&#xff1a;https://cherry-ai.com/download Cherry Studio 简介 Cherry S…

WGCLOUD监控系统部署教程

官网地址&#xff1a;下载WGCLOUD安装包 - WGCLOUD官网 第一步、环境配置 #安装jdk 1、安装 EPEL 仓库&#xff1a; sudo yum install -y epel-release 2、安装 OpenJDK 11&#xff1a; sudo yum install java-11-openjdk-devel 3、如果成功&#xff0c;你可以通过运行 java …

SolidWorks速成教程P2-5【草图 | 第五节】——草图镜像实体、阵列

SolidWorks教程草图阶段的最后一节&#xff0c;这节来分享草图镜像与阵列功能&#xff08;线性草图阵列、圆周草图阵列 &#xff09; 目录 1.镜像实体 2.阵列 1.镜像实体 我们先学习镜像实体功能&#xff0c;我们进入草图绘制&#xff0c;用鼠标笔势激活圆&#xff0c;在圆…

区块链100问之加密算法

区块链100问之加密算法 文章目录 区块链100问之加密算法哈希算法是什么&#xff1f;有什么特征&#xff1f;哈希碰撞是什么?雪崩效应呢&#xff1f;如何解决&#xff1f;哈希算法的作用&#xff1f;对称加密和非对称加密有什么区别&#xff1f;为什么会引入非对称加密&#xf…

从“听指令”到“会思考”:工业机器人的人工智能融合之旅

随着人工智能技术的快速发展&#xff0c;工业机器人系统正在逐步与AI进行深度融合&#xff0c;进而提升其自动化程度和智能化水平。从技术实现和工业应用的角度来看&#xff0c;AI与机器人系统的集成方式可以分为四个层次&#xff0c;按照集成程度由低到高进行排序。以下是四种…

【多模态大模型】系列2:如何用多GPU训练一个非常大的模型(数据/模型/流水线/张量并行、MoE、混合精度训练、压缩、激活重新计算)

目录 1 训练并行1.1 数据并行&#xff08;Data Parallelism&#xff09;1.2 模型并行&#xff08;Model Parallelism&#xff09;1.3 流水线并行&#xff08;Pipeline Parallelism&#xff09;1.4 张量并行&#xff08;Tensor Parallelism&#xff09; 2 混合专家&#xff08;M…

活动预告 | Power Hour: Copilot 引领商业应用的未来

课程介绍 智能化时代&#xff0c;商业应用如何实现突破&#xff1f;微软全球副总裁 Charles Lamanna 将为您深度解析&#xff0c;剖析其中关键因素。 在本次线上研讨会中&#xff0c;Charles Lamanna 将分享他在增强商业运营方面的独到见解与实战策略&#xff0c;深度解读商业…

神经网络常见激活函数 6-RReLU函数

文章目录 RReLU函数导函数函数和导函数图像优缺点pytorch中的RReLU函数tensorflow 中的RReLU函数 RReLU 随机修正线性单元&#xff1a;Randomized Leaky ReLU 函数导函数 RReLU函数 R R e L U { x x ≥ 0 a x x < 0 \rm RReLU \left\{ \begin{array}{} x \quad x \ge 0…

java基础5(黑马)

一、面向对象基础 1.面相对象编程快速入门 计算机是用来处理数据的。 单个变量 数组变量 对象数据 Student类&#xff1a; package cn.chang.object;public class Student {String name; double chinese_score; double math_score; public void printTotalScor…

C++ 继承(1)

1.继承概念 我们平时有时候在写多个有内容重复的类的时候会很麻烦 比如我要写Student Teacher Staff 这三个类 里面都要包含 sex name age成员变量 唯一不同的可能有一个成员变量 但是这三个成员变量我要写三遍 太麻烦了 有没有好的方式呢&#xff1f; 有的 就是继承…

C++入门基础篇:内存管理

本文是C内存管理部分的学习分享 希望能够对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 1. 内存分布 1.1 引入 在开始之前&#xff0c;我们先来看一道题目&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int st…