力扣刷题-210.课程表Ⅱ、图的表示方式、BFS

2023-11-11

一.图的基本概念

  1. 定义和基本术语

    图是由节点以及连接这些节点边组成。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

①.无向图:每条边连接的两个节点可以双向访问。

②.有向图:每条边连接的两个节点只能单向访问。

③.出度:有向图的某个节点作为起点的次数和。

④.入度:有向图的某个节点作为终点的次数和。

⑤.权重:图中每条边分配的值;根据图的边是否有权重,可以分为带权图和无权图。

  1. 应用举例

    ①.社交网络

    ​ 在社交网络中所有的用户构成了多对多的朋友关系网,这个关系网就是图:每个人都是图中的节点,互相认识的人之间通过边进行联系。如下图:

在这里插入图片描述

​ 在有些图中,节点之间的并不是完全对称的,比如在微信中:A和B互相加了好友,但A单方面删除了B,这样A的好友列表中已经没有了B,但B的好友列表中依然有A,这样图中节点之间的边就有了方向的区分,即为有向图。在QQ的好友关系中,当A删除了B的时候B的好友列表里也就同步没有了A,即节点之间的边没有方向的区分,即为无向图。

②.路线图

​ 在图中,可以给边分配一个数值叫权重,比如在一个路线图中,A市到B市的距离市2km,即从A节点出发到B节点的边的权重是2km,如下图所示:

在这里插入图片描述

二.图的表示方式

  1. 邻接矩阵

    邻接矩阵是表示图中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵的row和col表示的是0-n-1的n个点。对包含n个节点的图,可以用二维数组(矩阵)来表示节点之间两两的连接关系,如下图:

    vector<vector<int>> edges;//用二纬数组表示各点之间两两的连通关系
    int val = edges[i][j];//表示从节点i到节点j的边,0则表示非连通,有权重时也可以表示权重值
    
  2. 邻接列表

    邻接矩阵可以方便的得到一个节点到另个节点的关联关系,但是邻接矩阵给每个节点都分配n个边的空间,但实际有许多变是不存在的,会造成空间的浪费。

    邻接列表只关心存在的边,不关心不存在的边,如下图所示:

在这里插入图片描述

vector<vector<int>> edges(n);//无权图时,用n个一维数组构成的vector来存储邻接列表
vector<int> n_edge = edges[i];//存储节点i可以直接访问的节点列表

在这里插入图片描述

vector<vector<vector<int>>>edges(n);//有权图时,用n个二维数组构成的vector来存储邻接列表
edges[i][j][0];//表示节点i的第j个连通节点编号
edges[i][j][1];//表示节点i到第j个连通节点边的权重
  1. 边缘列表

    边缘列表是具有连接顶点及其权重的边的集合,如下图:

在这里插入图片描述

vector<vector<int>> edges;//无权图时,用一系列长度为2的vector构成vector来存储边缘列表
int u = edges[i][0];//第i条边的起点
int v = edges[i][1];//第i条边的终点

在这里插入图片描述

vector<vector<int>> edges;//带权图时,用一系列长度为3的vector构成vector来存储边缘列表
int u = edges[i][0];//第i条边的起点
int v = edges[i][1];//第i条边的终点
int val = edges[i][2];//边 u -> v 的权重

三.应用实例

LeetCode:210.课程表Ⅱ

现在你总共有 n 门课需要选,记为 0 到 n-1。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。

说明:

  1. 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。
  2. 你可以假定输入的先决条件中没有重复的边。
  1. 题目分析

    ①.题意

    ​ 要学习一门课程则必须学习完其所有的先决条件课程,即可以用有相图来描述这种依赖关系,节点间的连接关系不对等。

在这里插入图片描述

​ 当前可以上的课即为不依赖于任何一门剩下未学习的课的课,即图中入度为0的节点。可以采用BFS进行搜索访问所有节点。

​ 题目中先决条件使用边缘列表来表示图,转换成图的邻接列表后可以方便的获取某个节点可以访问的节点列表、同时记录节点的入度。

②.步骤

  • 图的边缘列表转成邻接列表,并记录节点入度
  • 入度为0的节点入队
  • 取出对首u,并将u加入结果数据
  • 将u的所有邻接点的入度减1,更改后入度为0的节点入队
  • 搜索结束后若结果数组的大小等于节点总数则满足要求
  1. 代码示例

    class Solution {
    public:
        vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
            vector<vector<int>> edges(numCourses) ;//邻接列表
            vector<int> inedg = vector(numCourses,0);//节点的入度
            vector<int> res;//结果保存
            //由图的边缘列表转换成图的邻接列表,根据u->v,给节点u的邻接点添加v、v的入度加1 
            for(int i = 0;i < prerequisites.size();i++)
            {
                edges[prerequisites[i][1]].push_back(prerequisites[i][0]);
                inedg[prerequisites[i][0]]++;
            }
            //BFS搜索,所有入度为0的节点依次入队
            queue<int> myqueue;
            for(int i = 0;i < numCourses;i++)
            {
                if(inedg[i] == 0)
                    myqueue.push(i);
            }
            while(!myqueue.empty())
            {
                int u = myqueue.front();myqueue.pop();
                res.push_back(u);
                //删除该节点后,该节点的所有邻接点的入度依次减1,变更后入度为0的节点入队
                for(int i = 0;i < edges[u].size();i++)
                {
                    if( --inedg[edges[u][i]] == 0)
                    {
                        myqueue.push(edges[u][i]);
                    }
                }
            }
            if( res.size() != numCourses)//返回结果和节点数不相等,则无法完成所有课程
                return {};
            return res;
        }
    };
    

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣刷题-210.课程表Ⅱ、图的表示方式、BFS 的相关文章

随机推荐

  • QT运行不出界面

    如果只出现如下一个黑色运行窗口 说明你环境配置的基本没啥问题 可以试试 项目 gt 构建设置中 gt General gt Shadow build 取消勾选 如下 如果第一种没有解决 看下构建出的release目录或者debug目录中 是
  • 自己实现图形验证码

    如果不想重复造轮子 参考上一篇文章 SpringBoot生成图形验证码 Muscleheng的博客 CSDN博客 这里不需要依赖开源组件包 完全自己实现图形验证码功能 两步完成 第一步 编写图形验证码工具 package com zhh d
  • 微信小程序 webiew缓存问题

    在微信小程序webview中嵌套H5页面 我们原本使用了localStorage用来标识用户信息的 但是后来发现在android手机上每一次杀掉小程序进程之后 localStorage的数据也会被清除 这样的话就和我们原本的意愿是相违背的
  • web 服务器安全维护,Web服务器安全攻击及防护机制详解

    Web安全分为两大类 Web服务器的安全性 Web服务器本身安全和软件配置 Web应用程序的安全性 在Web服务器上运行的Java ActiveX PHP ASP代码的安全 Web服务器面临的攻击 Web服务器攻击利用Web服务器软件和配置
  • 标定CCP协议在S32K144上的移植实战

    文章目录 目录 文章目录 前言 一 CCP是什么 二 移植步骤 1 准备工作 2 移植 3 测试验证 总结 前言 CCP协议在新能源汽车电子领域发挥着重要作用 CCP观测和标定作用对开发工程师起着重要作用 疫情宅在家无聊 把这块的知识重新梳
  • 4.3 配置Mysql与注册登录模块(下)

    目录 学习目标 学习内容 登录状态持久化 学习目标 前端页面授权 注册页面 登录状态的持久化 学习内容 实现前端页面的授权 import createRouter createWebHistory from vue router impor
  • LATEX以及宏包的下载和安装(附下载链接)

    LATEX以及宏包的下载和安装 附下载链接 TexStudio以及宏包下载和安装 LATEX以及宏包的下载和安装 附下载链接 1 环境下载 2 环境安装 2 1 MiKTeX安装 2 2 TexStudio的安装 3 配置 写作 1 环境下
  • 50个常见的 Java 错误及避免方法(第二部分)

    接上文50个常见的 Java 错误及避免方法 第一部分 17 Cannot Return a Value From Method Whose Result Type Is Void 当一个void方法尝试返回值时 就会发生此Java错误 例
  • Spring实现博客系统

    在上次用Servlet实现了博客系统之后 一直觉得代码写起来比较繁琐 而且耦合度很高 直到学习了Spring 我又看到了一线生机 运用SpringBoot重新改造了我的博客系统 接下来讲讲Spring是个什么东西 并把我的改造思路给大家分享
  • java 单列集合List 万字详解(通俗易懂)

    目录 前言 一 概述 二 特点 三 使用集合的经典四部曲 四 List接口的常用成员方法 前言 直接看汇总也可以 含讲解 1 常用十个成员方法及代码演示 准备工作1 准备工作2 public boolean add E e 代码演示 pub
  • cookies,sessionStorage 和 localStorage

    面试问题 如何实现浏览器内多个标签页之间的通信 既请描述一下 cookies sessionStorage 和 localStorage 的区别 cookie在浏览器和服务器间来回传递 sessionStorage和localStorage
  • linux创建线程失败errno=11

    问 题 为什么一个进程调用pthread create来创建线程 当251次就失败了 失败errno11 Resource temporarily unavailable 原 因 一个进程最多拥有250个线程资源 由于pthread cre
  • linux 命令 显示 但是不执行

    用 p命令答应以前的某条命令但是不执行 123 p
  • 026:vue中el-progress逆向倒计时方式显示

    第026个 查看专栏目录 VUE element UI 专栏目标 在vue和element UI联合技术栈的操控下 本专栏提供行之有效的源代码示例和信息点介绍 做到灵活运用 1 提供vue2的一些基本操作 安装 引用 模板使用 comput
  • Excel百万级数据导入导出,EasyExcel 才是真香

    在项目开发中往往需要使用到数据的导入和导出 导入就是从Excel中导入到DB中 而导出就是从DB中查询数据然后使用POI写到Excel上 大数据的导入和导出 相信大家在日常的开发 面试中都会遇到 很多问题只要这一次解决了 总给复盘记录 后期
  • Json与JavaBean之间的转换

    说到json与javaBean之间的转换 这两者更加频繁 json本身就是作为数据交换格式而存在的 在项目中用到的地方很多 这里我只说最常见的一处位置 那就是将数据转换成json再存储到redis中 redis作为缓存数据库 在电商项目中是
  • 物联网全称_物联网的魔力世界

    物联网顾名思义就是一种万物相连的网 英文全称 Internet of Things 缩写IoT 物联网可以让所有能行使独立功能的物体实现相互连接 通过物联网技术 可以用中心计算机对机器 设备或人员进行集中管理 控制 也可以对家用电器 汽车等
  • 构建 react应用程序 (二)(react-scripts实现原理)

    在前面讲到了使用create react app来创建项目 这节我们来分析下原理 react scripts有以下支持 都帮你配置好了 React JSX ES6 and Flow syntax support Language extra
  • xShell操作Linux的常用命令

    我们需要在本地连接Linux服务器 可以用winscp来进行连接 优点是图形化界面 文件的层级关系类似于Windows 更容易操作 也可以使用xShell来进行连接 查看和操作文件就需要使用Linux命令 文件的层级关系没有前者直观 但作为
  • 力扣刷题-210.课程表Ⅱ、图的表示方式、BFS

    一 图的基本概念 定义和基本术语 图是由节点以及连接这些节点边组成 无向图 每条边连接的两个节点可以双向访问 有向图 每条边连接的两个节点只能单向访问 出度 有向图的某个节点作为起点的次数和 入度 有向图的某个节点作为终点的次数和 权重 图