代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础

目录

图论理论基础

深度优先搜索理论基础

卡玛网 98.所有可达路径

广度优先搜索理论基础

图论理论基础

图论理论基础 | 代码随想录

图的基本概念

图的种类

大体分为有向图和无向图。

图中的边有方向的是有向图:

img

图中的边没有方向的是无向图:

img

图中的边有权值的是加权图:

img

无向图中的节点的度数表示有几条边连接该节点。

如下图中节点4的度为5,节点6的度为3:

img

有向图中的节点有出度和入度,出度为从该节点出发的边的个数,入度为指向该节点的边的个数。

如下图中节点3的入度为2,出度为1,节点1的入度为0,出度为2:

img

连通性

连通性表示图中节点的连通情况。

连通图

无向图中,任何两个节点都可以到达的图叫做连通图

img

如果有节点不能到达其它节点,则为非连通图:

img

强连通图

有向图中任何两个节点都可以相互到达的图叫做强连通图

img

连通分量

无向图中的极大连通子图称之为该图的一个连通分量

img

图中的节点1、2、5与节点3、4、6构成的两个子图就是该无向图中的两个连通分量,该子图所有节点都是相互可达到的。

强连通分量

有向图中的极大强连通子图称之为该图的强连通分量

img

图中节点1、2、3、4、5构成的子图是强连通分量,节点6、7、8构成的子图不是强连通分量

图的构造

邻接矩阵

邻接矩阵使用二维数组来表示图结构。 邻接矩阵是从节点的角度来表示图,数组大小与节点数相同。

有向图:grid[2][5] = 6,表示 节点 2 连接 节点5 为有向图,节点2 指向 节点5,边的权值为6。

无向图:grid[2][5] = 6, grid[5][2] = 6,表示节点2 与 节点5 相互连通,权值为6。

如图:

img

优点:

  • 表达方式简单,易于理解
  • 检查任意两个节点间是否存在边的操作很快
  • 适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。

缺点:

  • 遇到稀疏图,会导致申请过大的二维数组造成空间浪费,且遍历边的时候需要遍历整个 n * n 矩阵,造成时间浪费
邻接表

邻接表使用数组 + 链表的方式来表示图结构。邻接表是从边的数量来表示图,链表大小与边的数量相同。

img

  • 节点1 指向 节点3 和 节点5
  • 节点2 指向 节点4、节点3、节点5
  • 节点3 指向 节点4
  • 节点4指向节点1

优点:

  • 对于稀疏图的存储,只需要存储边,空间利用率高
  • 遍历节点连接情况相对容易

缺点:

  • 检查任意两个节点间是否存在边,效率相对低,需要 O(V)时间,V表示某节点连接其他节点的数量。
  • 实现相对复杂,不易理解

图的遍历

  • 深度优先搜索(DFS)
  • 广度优先搜索(BFS)

深度优先搜索理论基础

深度优先搜索理论基础 | 代码随想录

DFS 的关键是沿着一个方向搜索结果,直到无法继续搜索时再回溯换一个方向搜索。

代码框架:

void dfs(参数) {if (终止条件) {存放结果;return;}for (选择:本节点所连接的其他节点) {处理节点;dfs(图,选择的节点); // 递归回溯,撤销处理结果}
}

卡玛网 98.所有可达路径

题目

98. 所有可达路径

思路

代码随想录:98.所有可达路径

图的存储:

  1. 邻接矩阵:

            Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int M = scanner.nextInt();int[][] graph = new int[N + 1][N + 1];for (int i = 0; i < M; i++) {int a = scanner.nextInt();int b = scanner.nextInt();graph[a][b] = 1;}
    
  2. 邻接表

            Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int M = scanner.nextInt();List<LinkedList<Integer>> graph = new ArrayList<>(N + 1);for (int i = 0; i <= N; i++) {graph.add(new LinkedList<>());}for (int i = 0; i < M; i++) {int a = scanner.nextInt();int b = scanner.nextInt();graph.get(a).add(b);}
    

打印结果:

        //输出结果,注意最后一个数字不添加空格,但是要换行for (List<Integer> list : res) {for (int i = 0; i < list.size() - 1; i++) {System.out.print(list.get(i) + " ");}System.out.println(list.get(list.size() - 1));}

题解

邻接矩阵:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int M = scanner.nextInt();// 下标与题目输入保持一致int[][] graph = new int[N + 1][N + 1];// 初始化邻接矩阵for (int i = 0; i < M; i++) {int a = scanner.nextInt();int b = scanner.nextInt();graph[a][b] = 1;}List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();// 起点为1path.add(1);dfs(res, path, graph, 1);if (res.isEmpty())System.out.println(-1);//输出结果,注意最后一个数字不添加空格,但是要换行for (List<Integer> list : res) {for (int i = 0; i < list.size() - 1; i++) {System.out.print(list.get(i) + " ");}System.out.println(list.get(list.size() - 1));}}static void dfs(List<List<Integer>> res, List<Integer> path, int[][] graph, int index) {if (index == graph.length - 1) {res.add(new ArrayList<>(path));return;}for (int i = 1; i < graph.length; i++) {if (graph[index][i] == 1) {path.add(i);dfs(res, path, graph, i);path.remove(path.size() - 1);}}}
}

邻接表:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int M = scanner.nextInt();// 下标与题目输入保持一致List<LinkedList<Integer>> graph = new ArrayList<>(N + 1);// 初始化邻接表for (int i = 0; i <= N; i++) {graph.add(new LinkedList<>());}for (int i = 0; i < M; i++) {int a = scanner.nextInt();int b = scanner.nextInt();graph.get(a).add(b);}List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();// 起点为1path.add(1);dfs(res, path, graph, 1);if (res.isEmpty())System.out.println(-1);//输出结果,注意最后一个数字不添加空格,但是要换行for (List<Integer> list : res) {for (int i = 0; i < list.size() - 1; i++) {System.out.print(list.get(i) + " ");}System.out.println(list.get(list.size() - 1));}}static void dfs(List<List<Integer>> res, List<Integer> path, List<LinkedList<Integer>> graph, int index) {if (index == graph.size() - 1) {res.add(new ArrayList<>(path));return;}for (int i : graph.get(index)) {path.add(i);dfs(res, path, graph, i);path.remove(path.size() - 1);}}
}

797. 所有可能的路径

题目

797. 所有可能的路径 - 力扣(LeetCode)

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

示例 1:

在这里插入图片描述

输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

示例 2:

在这里插入图片描述

输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

提示:

  • n == graph.length
  • 2 <= n <= 15
  • 0 <= graph[i][j] < n
  • graph[i][j] != i(即不存在自环)
  • graph[i] 中的所有元素 互不相同
  • 保证输入为 有向无环图(DAG)
思路

在遍历之前先将 0 号几点加入路径。

由于本题的图为有向无环图(DAG),搜索过程中不会反复遍历同一个点,所以无需判断当前点是否遍历过。

题解
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> allPathsSourceTarget(int[][] graph) {path.add(0);dfs(graph, 0);return res;}void dfs(int[][] graph, int index) {if (index == graph.length - 1) {res.add(new ArrayList<>(path));return;}for (int neighbor : graph[index]) {path.add(neighbor);dfs(graph, neighbor);path.remove(path.size() - 1);}}
}

广度优先搜索理论基础

广度优先搜索理论基础 | 代码随想录

BFS 是从起点开始一圈一圈进行搜索的过程,如图:

图三

选择使用队列作为容器。

模板代码:

    // 表示四个方向,分别是右、下、左、上private static final int[][] DIR = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};// grid 是地图,也就是一个二维数组// visited 标记访问过的节点,不要重复访问// x, y 表示开始搜索节点的下标public static void bfs(char[][] grid, boolean[][] visited, int x, int y) {Queue<int[]> queue = new LinkedList<>(); // 定义队列queue.add(new int[]{x, y}); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点while (!queue.isEmpty()) { // 开始遍历队列里的元素int[] cur = queue.poll(); // 从队列取元素int curx = cur[0];int cury = cur[1]; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始向当前节点的四个方向(左右上下)遍历int nextx = curx + DIR[i][0];int nexty = cury + DIR[i][1]; // 获取周边四个方向的坐标// 坐标越界了,直接跳过if (nextx < 0 || nextx >= grid.length || nexty < 0 || nexty >= grid[0].length) {continue;}if (!visited[nextx][nexty]) { // 如果节点没被访问过queue.add(new int[]{nextx, nexty}); // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问}}}}

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

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

相关文章

【自学笔记】神经网络(1)

文章目录 介绍模型结构层&#xff08;Layer&#xff09;神经元 前向传播反向传播Q1: 为什么要用向量Q2: 不用激活函数会发生什么 介绍 我们已经学习了简单的分类任务和回归任务&#xff0c;也认识了逻辑回归和正则化等技巧&#xff0c;已经可以搭建一个简单的神经网络模型了。 …

详解Python面向对象程序设计

Python面向对象程序设计 1&#xff0c;初识类和对象2&#xff0c;类的定义和使用3&#xff0c;构造方法4&#xff0c;常用的类内置方法4.1&#xff0c;字符串方法&#xff1a;__str__ 4.2&#xff0c;是否小于&#xff1a;__lt__4.3&#xff0c;是否小于等于&#xff1a;__le__…

超级大项目招标:1000台AGV,12月13日截至

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 近期&#xff0c;一个重磅招标项目引发业界广泛关注&#xff1a;焦作机器人应用产业研究院发布总额高达11380万元的机器人采购项目&#xff0c;其中包括1000台AGV&#xff08;无人叉车…

内部知识库:优化企业培训流程的关键驱动力

在当今快速变化的商业环境中&#xff0c;企业培训的重要性日益凸显。内部知识库作为整合、管理和分享企业内部学习资源的关键工具&#xff0c;正逐步成为优化企业培训流程的核心。以下将探讨内部知识库如何通过多种功能&#xff0c;助力企业提升培训效率、质量和员工满意度。 …

宏集Cogent DataHub: 高效实现风电场数据集中管理与自动化

01 案例概况 一家跨国电力公司使用宏集Cogent DataHub软件&#xff0c;在美国西南地区建立起风电场的集中控制和数据采集系统。该系统整合来自不同风力涡轮机的 OPC 服务器数据&#xff0c;并确保数据安全、实时的上传至中心 SCADA 系统和 Pi 数据库。这一解决方案实现了与现有…

全星魅 北斗手持终端:重塑户外通信与导航新体验

在当今这个信息高速发展的时代&#xff0c;户外探险、应急救援、野外作业等领域对于通信设备的要求越来越高。QM570B北斗手持终端&#xff0c;作为一款集成了多项尖端技术的智能设备&#xff0c;以其卓越的性能和丰富的功能&#xff0c;为户外工作者提供了前所未有的通信与导航…

pycharm小游戏贪吃蛇及pygame模块学习()

由于代码量大&#xff0c;会逐渐发布 一.pycharm学习 在PyCharm中使用Pygame插入音乐和图片时&#xff0c;有以下这些注意事项&#xff1a; 插入音乐&#xff1a; - 文件格式支持&#xff1a;Pygame常用的音乐格式如MP3、OGG等&#xff0c;但MP3可能需额外安装库&#xf…

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

harbor官网地址&#xff1a;Harbor 参考文档可以看这里&#xff1a;部署 harbor 2.10.1 arm64 - 简书。 前提环境准备&#xff1a; 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…

【系统集成项目管理工程师教程】第13章 监控过程组

13.1控制质量 主要输入 项目管理计划&#xff08;质量管理计划&#xff09;、项目文件&#xff08;经验教训登记册、质量测量指标、测试与评估文件&#xff09;、批准的变更请求、可交付成果、工作绩效数据。 主要工具与技术 数据收集&#xff08;核对单、核查表、统计抽样、问…

水资源遥测终端机助力灌区信息化建设

随着社会的不断进步和人口数量的持续增加&#xff0c;水资源的管理和合理利用变得愈发关键。为了确保水资源能够得到科学的管理和高效的利用&#xff0c;智慧水务信息化建设已经成为当前社会面临的一项重要任务。在这一过程中&#xff0c;水资源遥测终端机扮演着至关重要的角色…

硬件知识10 线性稳压电源——二极管稳压、射级跟随器稳压、集成电路稳压

目录 一、相关理论 二、二极管稳压电路 1、理论与计算 2、不足 三、射级跟随器稳压电路 四、集成电路稳压器 1、78 79系列 2、LM317 LM337系列 3、功耗计算 一、相关理论 前文已进行了AC到DC的转换&#xff0c;只不过这个DC效果一般&#xff0c;因此需要用到稳压&…

Aop+自定义注解实现数据字典映射

数据字典 Web项目开发中&#xff0c;字典表的一般都会存在&#xff0c;主要用来给整个系统提供基础服务。 比如男女性别的类型可以使用0和1来进行表示&#xff0c;在存储数据和查询数据的时候&#xff0c;就可以使用字典表中的数据进行翻译处理。 再比如之前做的一个项目中宠物…

Cursor的chat与composer的使用体验分享

经过一段时间的试用&#xff0c;下面对 Composer 与 Chat 的使用差别进行总结&#xff1a; 一、长文本及程序文件处理方面 Composer 在处理长文本时表现较为稳定&#xff0c;可以对长文进行更改而不会出现内容丢失的情况。而 Chat 在更改长的程序文件时&#xff0c;有时会删除…

小北的字节跳动青训营与调用模型:调用模型:OpenAI API vs 微调开源Llama2/ChatGLM(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

Axure设计之三级联动选择器教程(中继器)

使用Axure设计三级联动选择器&#xff08;如省市区选择器&#xff09;时&#xff0c;可以利用中继器的数据存储和动态交互功能来实现。下面介绍中继器三级联动选择器设计的教程&#xff1a; 一、效果展示&#xff1a; 1、在三级联动选择器中&#xff0c;首先选择省份&#xff…

七次课掌握 Photoshop:选区与抠图

Photoshop 是一门选择的艺术。Photoshop 提供了多种工具和方法来创建选区&#xff0c;适用于不同的场景和需求。 理解和熟练使用这些工具&#xff0c;是提高图像处理能力的关键。 ◆ ◆ ◆ 选区方法与操作 一、创建选区的工具和命令 1、选区工具 &#xff08;1&#xff09;选…

智慧商城项目-VUE2

实现效果 项目收获 通过本项目的练习&#xff0c;可以掌握以下内容&#xff1a; 创建项目 ##基本创建 基于 VueCli 自定义创建项目架子,并对相关的配置进行选择 vue create demo-shopping调整目录 删除文件 删除初始化的一些默认文件 src/assets/logo.pngsrc/components…

Java | Leetcode Java题解之第546题移除盒子

题目&#xff1a; 题解&#xff1a; class Solution {int[][][] dp;public int removeBoxes(int[] boxes) {int length boxes.length;dp new int[length][length][length];return calculatePoints(boxes, 0, length - 1, 0);}public int calculatePoints(int[] boxes, int l…

PDF多功能工具箱 PDF Shaper v14.6

如今对PDF处理的软件很多都是只是单一的功能。PDF Shaper给你完全不同的体验&#xff0c;因为PDF Shaper是一款免费的PDF工具集合的软件。有了PDF Shaper&#xff0c;你以后再也不用下载其他处理PDF的软件了。PDF Shaper的功能有&#xff1a;合并&#xff0c;分割&#xff0c;加…

论文阅读--捍卫基于激光雷达视野范围的三维目标检测

目前存在的问题&#xff1a; 常用的体素化或鸟瞰图&#xff08;BEV&#xff09;表示相比&#xff0c;范围视图表示更紧凑且没有量化误差&#xff0c;但其在目标检测方面的性能很大程度上落后于体素化或 BEV 。范围视图尺度变化的挑战2D 图像不同&#xff0c;虽然距离图像的卷积…