代码随想录算法训练营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.xdnf.cn/news/7625.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

牛客练习赛131(dp,dfs,bfs,线段树维护等差数列)

文章目录 牛客练习赛131&#xff08;dp&#xff0c;dfs&#xff0c;bfs&#xff0c;线段树维护等差数列&#xff09;A. 小H学语文B. 小H学数学&#xff08;dp、偏移值&#xff09;C. 小H学生物&#xff08;DFS、树上两点间路径的距离&#xff09;D. 小H学历史(BFS)E. 小H学物理…

干货分享篇:Air780EP的硬件设计原理全解析(上)

一、绪论 Air780EP是一款基于移芯EC718P平台设计的LTE Cat 1无线通信模组。支持FDD-LTE/TDD-LTE的4G远距离无线传输技术。另外&#xff0c;模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。 二、综述 2.1 型号信息 表格 1&#xff1a;模块型号列表 2.2 主要性能…

Python将Word文档转为PDF

将word转pdf&#xff0c;只能使用办公工具&#xff0c;但是这些工具大都是收费。因此想用python 将word转pdf,发现很好用特此记录下。方法一&#xff1a;使用docx2pdf模块将docx文件转为pdf 要实现这样的功能&#xff0c;需要用到的就是 docx2pdf 这个python第三方库。对于doc…

无惧任天堂的法律威胁:Switch模拟器Ryujinx v1.2.72版发布

此前任天堂向多个提供 Nintendo Switch 模拟器项目发送律师函甚至直接起诉&#xff0c;要求这些项目立即停止更新、删除以及向任天堂提供经济赔偿。其中 Ryujinx 项目已经在 2024 年 10 月 1 日因任天堂的法律威胁而放弃项目&#xff0c;不过很快就有分叉版本出现&#xff0c;这…

JavaWeb——Web入门(6/9)-HTTP协议:协议解析(客户端的 HTTP 协议解析、服务端的 HTTP 协议解析、Web服务器的作用)

目录 概述 客户端的 HTTP 协议解析 服务端的 HTTP 协议解析 Web服务器的作用 概述 了解完 HTTP 协议的请求数据格式以及响应数据格式之后&#xff0c;接下来我们来讲了解 HTTP 协议的解析。 HTTP 协议的解析分为客户端和服务端两个部分&#xff0c;客户端浏览器中内置了解…

操作系统-实验报告单(2)

目录 1 实验目标 2 实验工具 3 实验内容、实验步骤及实验结果 一、自定义操作系统并启动 1. 最简单操作系统的编写并生成镜像文件 2.虚拟机启动操作系统 【思考题&#xff1a;1、仔细阅读helloos.nas&#xff0c;结合操作系统启动过程尝试分析它的作用&#xff1b;2、若…

城镇住房保障:SpringBoot系统优化技巧

3系统分析 3.1可行性分析 通过对本城镇保障性住房管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本城镇保障性住房管理系统采用SSM框架&#xff0c;JA…

FlyMcu串口下载STLink Utility

1、FlyMcu FlyMcu串口下载&#xff0c;同STC-ISP&#xff08;51单片机下载&#xff09;。 使用步骤&#xff1a; 1、STM32的USART1通过串口转usb连接到电脑 2、通过keil生成Hex、bin文件 生成bin、hex文件可参考 keil生成bin文件&#xff08;简单&#xff09;-CSDN博客 创建…

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数据,AWS实例存储

aws(学习笔记第十课) 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot&#xff0c;AWS实例存储 学习内容&#xff1a; 对AWS的EBS如何备份AWS实例存储EBS和实例存储的不足 1. 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot恢复数…

论文2—《基于柔顺控制的智能神经导航手术机器人系统设计》文献阅读分析报告

论文报告&#xff1a;基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对机器人辅助微创手术中定向障碍和缺乏导航信息的问题&#xff0c;设计了一种智能控制导航手术机器人系统。该系统采用可靠和安全的定位技术、7自由度机械臂以及避免关节角度限制的逆运动学控制策…

《数据结构与算法》二叉树基础OJ练习

二叉树的基础知识详见&#xff1a;《数据结构与算法》二叉树-CSDN博客 1 单值二叉树 思路 我们把树分成当前树&#xff08;用根和左孩子还有右孩子进行比较&#xff0c;如果左孩子或者右孩子为空那就不比了&#xff0c;如果左右孩子或者其中一个存在就比较&#xff0c;相等就是…

栈和队列(C 语言)

目录 一、栈1. 栈的概念2. 栈的结构3. 栈的实现思路4. 栈的实现代码 二、队列1. 队列的概念2. 队列的结构3. 队列的实现思路4. 队列的实现代码5. 循环队列 一、栈 1. 栈的概念 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除操作&#xff0c;该端被称为栈…

自动化测试工具Ranorex Studio(二十五)-库的拆分

默认地&#xff0c;每一个Ranorex Studio项目包含一个对象库文件&#xff0c;这个文件自动用在每一个新创建的录制中。你可以在一个单独的库文件中管理一个测试套件项目中所有的UI元素&#xff0c;但是在一个自动化测试项目中多个对象库的存在还是有一些原因的&#xff1a; .测…

Centos下安装Maven(无坑版)

Linux 安装 Maven Maven 压缩包下载与解压 华为云下载源&#xff0c;自行选择版本 下面的示例使用的是 3.8.1 版本 wget https://repo.huaweicloud.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压 tar -zxvf apache-maven-3.8.1-bin.tar.gz移…

99、Python并发编程:多线程的问题、临界资源以及同步机制

引言 多线程技术的引入&#xff0c;可以帮助我们实现并发编程&#xff0c;一方面可以充分利用CPU计算资源&#xff0c;另一方面&#xff0c;可以在用户体验上带来极大的改善。但是&#xff0c;多线程技术也存在一些问题。本文就来简单聊一下多线程引入导致的问题&#xff0c;以…

jmeter常用配置元件介绍总结之取样器

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之取样器 jmeter常用配置元件介绍总结之取样器 2.取样器2.1.HTTP请求2.2.Debug Sampler2.3.JSR223 Sampler2.4.JDBC Connection Configuration和J…

Python练习11

Python日常练习 题目&#xff1a; 编写一个石头剪刀布游戏&#xff0c;该程序要求完成如下功能&#xff1a; (1) 显示游戏规则&#xff0c;提醒用户输入一个1-3的整数或者直接回车。 用户输入回车时游戏结束。 用户输入不合法&#xff08;包括输入的…

什么是欧拉角和四元数

涉及机器人调度工作的一些基本概念整理理解 目录 什么是欧拉角和四元数 &#xff1f;相关工具网站相关工具代码 什么是欧拉角和四元数 &#xff1f; 这里画了一张图&#xff0c;简明方便理解&#xff1a; 欧拉角 (Euler Angles) 是一种描述物体在三维空间旋转姿态的方法&…

关于几种卷积

1*1卷积 分组卷积&深度可分离卷积 空洞卷积、膨胀卷积 转置卷积 https://zhuanlan.zhihu.com/p/80041030 https://yinguobing.com/separable-convolution/#fn2 11的卷积可以理解为对通道进行加权&#xff0c;对于一个通道来说&#xff0c;每个像素点加权是一样的&am…