C++练习:图论的两种遍历方式

news/2024/12/25 11:32:44/

一、遍历

一提到遍历,我们首先想到的肯定是树的遍历。因为在数据结构中我们是从树引出图的。但图明显比树更常见,更丰富,更多变。所以我们可能会被树的一些知识所固化了思维。比如树的遍历有前、中、后遍历,或者深度优先、广度优先搜索等。但这些都是正向遍历,从一个固定的起点开始,自上而下。可在图中除了正向遍历,你还可能可以逆向遍历。

二、正向和逆向

图论中,正向遍历和反向遍历指的是根据图的结构(如边的方向)对节点进行访问的两种不同方式。它们主要用于有向图中,因为无向图没有明确的方向性,所以这种区分不那么明显。

正向遍历

  • 定义:按照图中边的方向从一个节点到另一个节点进行遍历。
  • 适用场景:当您需要遵循关系或路径的方向时,例如在一个依赖关系图中,您可能希望从先决条件开始,然后按顺序处理每个后续任务。
  • 算法示例:深度优先搜索(DFS)、广度优先搜索(BFS),以及其他基于图的算法,通常默认是正向遍历。

反向遍历

  • 定义:与边的方向相反的方式进行遍历,即逆着箭头方向。
  • 适用场景:反向遍历对于解决某些特定问题非常有用,比如寻找哪些节点可以到达给定的终点,或者在拓扑排序中,如果需要找出所有依赖于某个节点的其他节点。
  • 算法示例:Kosaraju算法用于查找强连通分量,其中一个步骤就是反向遍历图。

选择依据

  • 使用正向遍历时:如果您关心的是起点到终点的路径,或者是想了解一个节点能直接或间接到达哪些其他节点,那么正向遍历通常是合适的选择。
  • 使用反向遍历时:如果您更关注哪些节点可以到达特定的终点,或者是想要分析依赖关系中的上游节点,反向遍历会更加有效。

总之,选择正向还是反向遍历取决于您试图解决的具体问题以及图的结构特点。理解您的需求和图的特点将帮助您决定采用哪种遍历方式。

三 、1376

正向:

class Solution {int maxTime = 0;void dfs(int root, int allTime, vector<vector<int>> &map, vector<int>& informTime){if(map[root].size() == 0) maxTime = max(maxTime, allTime);for(auto son : map[root]){dfs(son, allTime + informTime[root], map, informTime);}}public:int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {vector<vector<int>> map(n);for(int i = 0; i < n; ++ i){if(manager[i] == -1) continue;map[manager[i]].emplace_back(i);}dfs(headID, 0, map, informTime);return maxTime;}
};
逆向:```cpp
class Solution {vector<int> dp;void dfs(int i, vector<int> &manager, vector<int>& informTime){if(dp[i] != -1) return;if(dp[manager[i]] == -1) dfs(manager[i], manager, informTime);dp[i] = dp[manager[i]] + informTime[manager[i]];}public:int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {dp.resize(n, -1);dp[headID] = 0;int maxTime = 0;for(int i = 0; i < n; ++ i){dfs(i, manager, informTime);maxTime = max(maxTime, dp[i]);}return maxTime;}
};

http://www.ppmy.cn/news/1557982.html

相关文章

我在广州学 Mysql 系列——数据表查询命令详解

ℹ️大家好&#xff0c;我是LXJ&#xff0c;今天星期二了&#xff0c;本文将讲述MYSQL查询数据的详细命令以及相关例题~~ 复习&#xff1a;&#x1f449;《Mysql函数的练习题》 同时&#xff0c;数据库相关内容查看专栏&#x1f449;【数据库专栏】~ 想要了解更多内容请点击我的…

互联网视频云平台EasyDSS无人机推流直播技术如何助力野生动植物保护工作?

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;无人机技术已经广泛应用于各个领域&#xff0c;为我们的生活带来了诸多便利。而在动植物保护工作中&#xff0c;无人机的应用更是为这一领域注入了新的活力。EasyDSS&#xff0c;作为一款集视频处理、分发、存储于一体的综…

谷歌开发者工具 - 控制台篇

Chrome DevTools - Console控制台篇 一、官网二、主要用途三、控制台篇1.JavaScript/浏览器消息记录&#xff08;1&#xff09;演示效果 / 两种记录状态&#xff08;2&#xff09;显示导致调用的堆栈轨迹 2.过滤消息&#xff08;1&#xff09;按日志级别过滤&#xff08;2&…

计算机网络 - HTTP 协议和万维网

基本概念 万维网 (World Wide Web, WWW) 定义&#xff1a;一个大规模的分布式信息系统&#xff0c;由全球范围内无数个网络站点和网页组成特点&#xff1a;基于超文本技术&#xff0c;支持多媒体内容的展示和交互URL (Uniform Resource Locator) 定义&#xff1a;统一资源定位…

Python fastapi模块入门介绍(基本介绍 unicorn模块 异步函数 FastAPI类 SwaggerUI)

文章目录 基本介绍安装方法必要依赖uvicorn异步函数FastAPI类Swagger UI 基本介绍 fastapi 是Python中一个用于构建Web应用程序的现代框架&#xff0c;并且支持自动生成OpenAPI文档&#xff0c;可以快速开发API。 安装方法 pip install fastapi必要依赖uvicorn 基本介绍&am…

web移动 第四章

B站《前端Web开发HTML5CSS3移动web视频教程》第十五天课程学习&#xff1a;响应式网页 一、媒体查询 media(媒体样式) {选择器{css样式}}媒体特性&#xff1a; max-width min-width 1.书写顺序 因为css样式有层叠性&#xff0c;所以书写的时候要遵循下面的顺序 min-width&a…

企业数字化转型加速度,Yeeco平台先行筑牢转型底座

在当今数字化浪潮汹涌澎湃的时代&#xff0c;企业数字化转型已成为提升竞争力、实现可持续发展的必由之路。然而&#xff0c;面对市场上琳琅满目的数字化平台产品&#xff0c;企业在选型时往往陷入困境。 众多的选择看似提供了丰富的可能性&#xff0c;但也带来了诸多难题&…

内容与资讯API优质清单

作为开发者&#xff0c;拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源&#xff0c;为你的开发工作提供了强大的支持&#xff01;无论你是在构建网站、开发应用还是进行数据分析&#xff0c;这个合集都能满足你的需求。你可以通过这些免费API获…