算法题:图的表示形式与遍历框架

图的基本概念

        在数据结构和算法上,图的数据表示一般使用邻接表和邻接矩阵的形式。

比如:

        邻接表和邻接矩阵存储如下。邻接表是用vector[vector[i]] 存储每个节点指向的节点,邻接矩阵是用一个二维矩阵matrix[i][j]表示,如果第数据的i维和j维元素为true(黄色),表示这里存在节点i到j的连接。

        和邻接矩阵相比,邻接表更省存储空间,但是无法快速判断两个节点是否相连(比如判断i到j, 需要找到i个节点对应的vector,然后判断j是否存在。

         再明确一个图论中特有的(degree)的概念,在无向图中,「度」就是每个节点相连的边的条数。由于有向图的边有方向,所以有向图中每个节点「度」被细分为入度(indegree)和出度(outdegree),比如上面的有向图中,节点3的出度为3(有3条边指向它),出度为1(有1条边指向别的节点)。

加权有向图值的是,有向图中节点之间的连接加了权重值,比如在邻接矩阵中,matrix[i][j]不再是布尔值,而是一个int值,0表示无连接,其他值表示连接权重。

图的遍历

        各种数据结构被发明出来,无非就是为了遍历和访问,遍历是所有数据结构的基础。

图的遍历可以参考多叉树的DFS遍历框架

/* 多叉树遍历框架 */
void traverse(TreeNode* root) {
    if (root == nullptr) return;
    // 前序位置
    for (TreeNode* child : root->children) {
        traverse(child);
    }
    // 后序位置
}

        图和多叉树最大的区别是,图是可能包含环的,你从图的某一个节点开始遍历,有可能走了一圈又回到这个节点,而树不会出现这种情况,从某个节点出发必然走到叶子节点,绝不可能回到它自身。

        所以图如果包含环,需要一个visited数组进行辅助。 onPath 数组的操作很像回溯算法套路的做「做选择」和「撤销选择」,区别在于位置:回溯算法的「做选择」和「撤销选择」在 for 循环里面,而对 onPath 数组的操作在 for 循环外面。

// 记录被遍历过的节点
vector<bool> visited;
// 记录从起点到当前节点的路径
vector<bool> onPath;

/* 图遍历框架 */
void traverse(Graph graph, int s) {
    if (visited[s]) return;
    // 经过节点 s,标记为已遍历
    visited[s] = true;
    // 做选择:标记节点 s 在路径上
    onPath[s] = true;
    for (int neighbor : graph.neighbors(s)) {
        traverse(graph, neighbor);
    }
    // 撤销选择:节点 s 离开路径
    onPath[s] = false;
}

示例

来看力扣第 797 题「 所有可能路径」,力扣

题目输入一幅有向无环图,这个图包含 n 个节点,标号为 0, 1, 2,..., n - 1,请你计算所有从节点 0 到节点 n - 1 的路径。

输入的这个 graph 其实就是「邻接表」表示的一幅图,graph[i] 存储这节点 i 的所有邻居节点。

比如输入 graph = [[1,2],[3],[3],[]],就代表下面这幅图:

class Solution {
    // 记录所有路径
    vector<vector<int>> res;

public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        // 维护递归过程中经过的路径
        vector<int> path;
        traverse(graph, 0, path);
        return res;
    }

    /* 图的遍历框架 */
    void traverse(vector<vector<int>>& graph, int s, vector<int>& path) {
        // 添加节点 s 到路径
        path.push_back(s);

        int n = graph.size();
        if (s == n - 1) {
            // 到达终点
            res.push_back(path);
            // 可以在这直接 return,但要正确维护 path
            // path.pop_back();
            // return;
            // 不 return 也可以,因为图中不包含环,不会出现无限递归
        }

        // 递归每个相邻节点
        for (int v : graph[s]) {
            traverse(graph, v, path);
        }
        
        // 从路径移出节点 s
        path.pop_back();
    }
};

 内容来源:图论基础及遍历算法 :: labuladong的算法小抄

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

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

相关文章

小米手机root后过软件检测

工具&#xff1a; https://wwp.lanzouf.com/b0cybm3ib 密码: 9hn8 视频讲解&#xff1a;隐藏root终极教程&#xff08;2022年&#xff09; 演示机型&#xff1a;小米10&#xff0c;安卓14&#xff0c;MIUI14.0.2 问题描述 安装magisk后使用病毒扫描发现支付环…

Flink (十) --------- 容错机制

目录一、 检查点&#xff08;Checkpoint&#xff09;1. 检查点的保存2. 从检查点恢复状态3. 检查点算法4. 检查点配置5. 保存点&#xff08;Savepoint&#xff09;二、状态一致性1. 一致性的概念和级别2. 端到端的状态一致性三、端到端精确一次&#xff08;end-to-end exactly-…

ActiveMQ使用(二):在JavaScript中使用mqtt.js

ActiveMQ使用(二):在JavaScript中使用mqtt.js 1. 环境准备 jQuery-1.10 下载地址:https://www.jsdelivr.com/package/npm/jquery-1.10.2?tabfilesmqtt.js 4.3.7: 下载地址:https://www.jsdelivr.com/package/npm/mqtt 2. 相关代码 <!DOCTYPE html> <html lang&q…

和开振学Spring boot 3.0之Spring MVC:④获取参数(上)

之前&#xff0c;我反复说过处理器封装了控制器&#xff0c;HandlerMapping的机制找到处理器后&#xff0c;通过处理器就能运行控制器&#xff0c;那么处理器增强了控制器什么功能呢&#xff1f; 我们用脑子想一下&#xff0c;要运行控制器之前&#xff0c;我们需要做什么&…

《Java8实战》第1章 Java 8、9、10 以及 11 的变化

如想了解 Oracle 公司对 JDK 的最新支持情况&#xff0c;请访问https://www.oracle.com/technetwork/java/java-se-supportroadmap.html。所有的示例代码均可见于图灵社区本书主页 http://ituring.com.cn/book/2659“随书下载”处。 1.1 为什么要关心 Java 的变化 Java8做的…

小程序的组件化开发

目录&#xff1a; 1 小程序组件化思想 2 自定义组件的过程 3 组件样式实现细节 4 组件使用过程通信 5 组件插槽定义使用 6 Component构造器 在小程序里面需要创建组件的话需要在最外层建component包&#xff0c;然后在使用新建component来创建类似page的4个文件&#xff…

Spark 简介与原理

目录标题1 Spark 简介与原理1.1 Spark与Hadoop的区别1.2 Spark的应用场景1.3 Spark的作业运行流程1.4 Spark 2.X与Spark 1.X的区别1 Spark 简介与原理 Spark 是一个大规模数据处理的统一分析引擎。 具有迅速、通用、易用、支持多种资源管理器的特点。 Spark生态系统: Spark SQL…

C++之AVL树

文章目录前言一、概念二、AVL树结点的定义三、AVL树的插入四、AVL树的旋转1.右单旋的情况以及具体操作抽象图h 0h 1h 2代码实现2.左单旋的情况以及具体操作抽象图代码实现3.右左双旋的情况以及具体操作抽象图h 0h 1h 23.左右双旋的情况以及具体操作抽象图5.总结6.完整实现…

stable-diffusion-webui浅叙

GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 使用Git下载&#xff1a; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 运行 webui-user.bat : git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.g…

Python每日一练(20230413)

目录 1. 最后一个单词的长度 ※ 2. 全排列 &#x1f31f;&#x1f31f; 3. 计数质数 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 最后一个单词的长度 给你一个字符串 s&…

sql server 入门教程

sql server 入门教程 1、创建数据库 1&#xff09;鼠标右键数据库选项&#xff0c;点击新建数据库 2&#xff09;命名数据库 根据自己业务情况取一个自定义数据库名字&#xff0c;比如&#xff1a;my_database 3&#xff09;查看数据库 如果添加没看到&#xff0c;那么可鼠…

知识图谱:Neo4j数据库的基本使用——创建张学良的关系谱

一、知识图谱及Neo4j数据库介绍 知识图谱&#xff08;Knowledge Graph&#xff09;是人工智能的重要分支技术&#xff0c;它在2012年由谷歌提出&#xff0c;是结构化的语义知识库&#xff0c;用于以符号形式描述物理世界中的概念及其相互关系&#xff0c;其基本组成单位是“实体…

安全防御第四天:防病毒网关

一、恶意软件1.按照传播方式分类&#xff08;1&#xff09;病毒病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点…

基于目标级联法的微网群多主体分布式优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

花了近三周时间对 ChatGPT 进行多方面了解、体验后写的报告,超级全面,建议想了解的朋友看看

优质介绍视频&#xff1a; GPT4前端【AI编程新纪元】 【渐构】万字科普GPT4为何会颠覆现有工作流&#xff1b;为何你要关注微软Copilot、文心一言等大模型 ChatGPT 是什么&#xff1a;ChatGPT最初是2022年11月30日由OpenAI开发并推出的聊天机器人&#xff0c;是基于 GPT-3.5 …

Spring 源码分析(二)——GenericBeanDefinition 分析

BeanDefinition 中存储着 Bean 的定义信息&#xff0c;它具有属性值、构造函数参数值以及具体实现 Bean 提供的进一步信息&#xff0c;在学习 Spring 的 Bean 初始化流程之前&#xff0c;还是非常有必要先了解一下 BeanDefinition。 一、注册 Bean 示例 首先&#xff0c;本文…

SQL Server的日志传送

日志传送和复制一、前言二、相关术语和定义三、日志传送和复制3.1、在主数据库丢失时从辅助数据库进行复制的要求和过程3.2、使用事务复制进行日志传送3.3、使用合并复制进行日志传送一、前言 日志传送允许您自动将事务日志备份从主服务器实例上的主数据库发送到单独辅助服务器…

高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

目录前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申&#xff1a;在服务器上运行后台进程1-2-5、nohup和&的区别二、进程查看2-1、jobs命令&#xff08;基本不用&#xff09;2-2、ps命令…

Msray-Plus采集工具让您的市场营销更加简单,让您的营销成果更加显著

市场营销是现代企业不可或缺的一环&#xff0c;企业的发展和营销成果密不可分。然而&#xff0c;市场营销的过程中&#xff0c;需要大量的数据采集和整理工作&#xff0c;这对于营销人员来说是一项繁琐的工作&#xff0c;同时也是一项非常重要的工作。因为数据的准确性和完整性…

NumPy 秘籍中文第二版:十二、使用 NumPy 进行探索性和预测性数据分析

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们涵盖以下秘籍&#xff1a; 探索气压探索日常气压范围研究年度气压平均值分析最大可见度用自回归模型预测气压使用移动平均模型预测气压研究年…
最新文章