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

devtools/2024/12/25 11:59:17/

一、遍历

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

二、正向和逆向

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

正向遍历

  • 定义:按照图中边的方向从一个节点到另一个节点进行遍历。
  • 适用场景:当您需要遵循关系或路径的方向时,例如在一个依赖关系图中,您可能希望从先决条件开始,然后按顺序处理每个后续任务。
  • 算法示例:深度优先搜索(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/devtools/145251.html

相关文章

我用Cursor+DeepSeek做了个飞书文档一键同步插件,免费使用!

作为一个飞书文档的重度使用者&#xff0c;我基本上都是先在飞书上写好文章&#xff0c;然后再想办法搬到其他平台上&#xff0c;所以对飞书一键同步有很强的需求。​ 于是我决定做个插件来支持飞书文档的同步。​ 说实话我是第一次玩插件&#xff0c;源代码看起来有些陌生&a…

在 .NET Core 中使用 ActionBlock 实现高效率的多步骤数据处理

一、引言 本篇使用 ActionBlock 二、ActionBlock介绍 什么是 ActionBlock? ActionBlock是 .NET 中 TPL Dataflow 库的一部分,用于处理数据流和并行任务。它提供了一种简单而强大的方式来处理并行任务,并且可以轻松地实现生产者-消费者模式。 ActionBlock 的特点 并行处…

SpringBoot 依赖之Spring Web

SpringBoot 依赖之 Spring Web 详细介绍 Spring Web 依赖的内容&#xff1a; 第 1 章&#xff1a;Spring Web 1. 简介 功能描述 英文: Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.中文译文&…

【AscendC】记录LpNorm的tiling方案中用到的一些变量

LpNorm的官方仓库链接在operator_contrib/LpNormV2CustomSample/FrameworkLaunch/LpNormV2Custom。观察其tiling方案可以看到&#xff0c;有几个比较特殊的变量&#xff1a;pType,pValue,stepSize,unitCount&#xff0c;totalLength。下面结合代码分别对其进行分析。 pType 类…

B/S 跟C/S架构的区别

B/S架构&#xff08;浏览器/服务器&#xff09; 特点&#xff1a; 用户界面&#xff1a; 用户通过网页浏览器访问服务器上的应用程序&#xff0c;用户界面主要在客户端浏览器中渲染。集中式处理&#xff1a; 所有的业务逻辑和数据处理都在服务器端进行&#xff0c;客户端仅负…

【Leetcode】1705. 吃苹果的最大数目

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 有一棵特殊的苹果树&#xff0c;一连 n n n 天&#xff0c;每天都可以长出若干个苹果。在第 i i i 天&#xff0c;树上会长出 a p p l e s [ i ] apples[i] apples[i] 个苹果&a…

Vue中使用a标签下载静态资源文件(比如excel、pdf等),纯前端操作

第一步&#xff0c;public文件夹下新建static文件夹存放静态资源 我存放了一个 .docx文件&#xff0c;当然&#xff0c;你可以存放pdf/word 等文件都可以。 第二步&#xff0c;模拟a标签下载 //html部分<el-button type"primary" plain click"download&quo…

java开发入门学习五-流程控制

流程控制语句 if&#xff0c; if...else&#xff0c; if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式&#xff0c;使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…