Day50 图论part01

devtools/2024/12/26 14:43:33/

图论理论基础

大家可以在看图论理论基础的时候,很多内容 看不懂,例如也不知道 看完之后 还是不知道 邻接矩阵,邻接表怎么用, 别着急。

理论基础大家先对各个概念有个印象就好,后面在刷题的过程中,每个知识点都会得到巩固。

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

深搜理论基础

了解一下深搜的原理和过程

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

98. 所有可达路径

代码随想录

方法1:邻接矩阵

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;public class Main{public static List<Integer> path = new ArrayList<>();public static List<List<Integer>> result = new ArrayList<>();public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int[][] graph = new int[n+1][n+1];while(m-- > 0){int s = sc.nextInt();int t = sc.nextInt();graph[s][t] = 1;}path.add(1);dfs(graph, 1, n);if(result.isEmpty()){System.out.println(-1);}for(List<Integer> p : result){for(int i = 0; i < p.size() - 1; i++){System.out.print(p.get(i) + " ");}System.out.println(p.get(p.size() - 1));}}public static void dfs(int[][] graph, int x, int n){//这里n是表示节点数量if(x == n){//这里的n是表示路径的终节点result.add(new ArrayList<>(path));return;}for(int i = 1; i <= n; i++){if(graph[x][i] == 1){path.add(i);dfs(graph, i, n);path.remove(path.size() - 1);}}}}

方法2:邻接链表

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;public class Main{public static List<Integer> path = new ArrayList<>();public static List<List<Integer>> result = new ArrayList<>();public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();List<LinkedList<Integer>> graph = new ArrayList<>(n+1);for(int i = 0; i <= n; i++){graph.add(new LinkedList<>());}while(m-- > 0){int s = sc.nextInt();int t = sc.nextInt();graph.get(s).add(t);}path.add(1);dfs(graph, 1, n);if(result.isEmpty()){System.out.println(-1);}for(List<Integer> p : result){for(int i = 0; i < p.size() - 1; i++){System.out.print(p.get(i) + " ");}System.out.println(p.get(p.size() - 1));}}public static void dfs(List<LinkedList<Integer>> graph, int x, int n){//这里n是表示节点数量if(x == n){//这里的n是表示路径的终节点result.add(new ArrayList<>(path));return;}for(int i : graph.get(x)){path.add(i);dfs(graph, i, n);path.remove(path.size() - 1);}}}

总结:

1.本题练习的是ACM模式,所以必须熟悉图的存储方法和结果的输出方法。图的存储方法分为邻接矩阵和邻接链表。邻接矩阵是从节点的角度来表示图,使用二维数组来表示图结构。例如: grid[2][5] = 6,表示 节点 2 连接 节点5 为有向图,节点2 指向 节点5,边的权值为6。如果想表示无向图,即:grid[2][5] = 6,grid[5][2] = 6,表示节点2 与 节点5 相互连通,权值为6。邻接链表一般是通过数组+链表,数组里面就存放节点,链表里面存放的是节点可以连通的节点,也就是边。比如1-3-5 表示的是节点1 指向 节点3 和 节点5,并不是节点1连着3,3后面连着5,这点要搞清楚。 链表一般是通过这种方法创建的List<LinkedList<Integer>> graph = new ArrayList<>(n+1);然后记得LinkedList<Integer>一定要先new 出来,然后在add元素进去。

2.dfs里面的处理逻辑就比较简单了,我们先找到当前节点连通的节点 path.add(i);然后以该连通的节点递归继续就行查找dfs(graph, i, n);直到找到目标节点,然后回溯 path.remove(path.size() - 1);

3.由于题目中说了图中不存在自环,所以起始节点不会被自动加入到路径里面,需要我们手动加入到路径当中。

           

广搜理论基础

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


http://www.ppmy.cn/devtools/145550.html

相关文章

Hive其五,使用技巧,数据查询,日志以及复杂类型的使用

目录 一、关于Hive使用的一些技巧 二、表的数据查询 三、Hive默认的日志 四、复杂数据类型 1、Array的使用 2、展开函数的使用 explode 3、Map的使用 4、Struct结构体 一、关于Hive使用的一些技巧 1、可以直接不进入hive的情况下执行sql语句 通过shell的参数 -e 可以执…

PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读

一、前言 在本篇博客中介绍的vue-pdf-embed核心逻辑是获取pdf内容并将其每一页渲染到canvas画布上&#xff0c;以类似图片的方式展示出来。pdf作为本地资源放在项目中。二、vue-pdf-embed是什么 vue-pdf-embed是一个基于Vue.js的插件&#xff0c;专门用于在Vue应用中嵌入和展示…

Maven 项目文档

如何创建 Maven 项目文档。 比如我们在 C:/MVN 目录下&#xff0c;创建了 consumerBanking 项目&#xff0c;Maven 使用下面的命令来快速创建 java 项目&#xff1a; mvn archetype:generate -DgroupIdcom.companyname.bank -DartifactIdconsumerBanking -DarchetypeArtifact…

重温设计模式--C++迭代器种类和用法

文章目录 定义1、 输入迭代器&#xff08;Input Iterator2、输出迭代器&#xff08;Output Iterator&#xff09;3、前向迭代器&#xff08;Forward Iterator&#xff09;4、双向迭代器&#xff08;Bidirectional Iterator&#xff09;5、 随机访问迭代器&#xff08;Random - …

基于python语音启动电脑应用程序

osk模型进行输入语音转换 txt字典导航程序路径 pyttsx3引擎进行语音打印输出 关键词程序路径 import os import json import queue import sounddevice as sd from vosk import Model, KaldiRecognizer import subprocess import time import pyttsx3 import threading# 初始…

【YashanDB知识库】XMLAGG方法的兼容

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802943.html?templateId1718516 【关键字】 XMLAGG方法的兼容 【问题描述】 崖山数据库不支持将XMLAGG相关的函数内容&#xff0c;需要替换成支持的功能函数WM_CONCAT(T.COLUMN_NAME…

nlohmann的常用用法

3.9之后新增了 2个宏 可以实现 结构体和json的快速转换 1.结构体序列化json 1.1 3.9 #include <iostream> #include <string> #include <vector> #include "json.hpp"// 定义用户结构体 struct User {std::string name; // 用…

YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM

如何在增强特征图的同时降低计算成本&#xff0c;以提升模型性能。基于此&#xff0c;MSCAM 模块采用了多尺度卷积注意力机制&#xff0c;通过 CAB、SAB 和 MSCB 三个子模块协同工作。CAB 利用自适应池化和卷积操作生成通道注意力权重&#xff0c;强调重要通道特征&#xff1b;…