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

server/2024/12/25 10:04:49/

一、遍历

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

二、正向和逆向

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

正向遍历

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

相关文章

Vue 3 和 Vue Router 使用 createWebHistory 配置

在 Vue 3 项目中&#xff0c;如果使用 Vue Router 并希望启用 HTML5 History 模式&#xff0c;需要在创建路由器实例时传入 createWebHistory 作为历史模式的配置。此外&#xff0c;还需要确保在生产环境中设置正确的基本路径&#xff08;base&#xff09;&#xff0c;这样才能…

C语言初阶【13】——打印一个数的每一位(递归和非递归实现)

1. 题目 打印一个数的每一位 2.分析 首先先实现非递归方式&#xff0c; 以123为例。我们要获取它的每一位&#xff0c; 获取个位数&#xff1a;123 %10 3 获取十位数&#xff1a;123/10 12 之后在 12%10 2&#xff1b; 获取百位数&#xff1a;12/10 1 之后再1%10 1&#x…

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的&#xff0c;在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号&#xff0c;到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了

SSM 架构支撑的 JAVA 网络直播带货查询系统设计及 JSP 落地实践

第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于网络直播带货网站所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理&#xff0c;用户…

MySQL索引。

2.1 索引概述 2.1.1 介绍 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足 特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就…

SQL 实战-巧用 CASE WHEN 实现条件分组与统计

在 SQL 查询中&#xff0c;CASE WHEN 是一个非常强大的条件表达式&#xff0c;能够灵活地实现复杂的分组、统计、分类汇总等功能。尤其在进行报表开发或数据分析时&#xff0c;CASE WHEN 可以帮助我们轻松实现条件分组统计&#xff0c;而不必依赖多次查询或编写复杂的存储过程。…

Unity命令行传递自定义参数 命令行打包

命令行参数增加位置 -executeMethod 某脚本.某方法 参数1 参数2 参数3 ... 例如执行EditorTest.GetCommandLineArgs方法 增加两个命令行参数 Version=125 CDNVersion=100 -executeMethod EditorTest.GetCommandLineArgs Version=125 CDNVersion=100 Unity测试脚本 需要放在…

前端react入门day01-了解react和JSX基础

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 React介绍? React是什么 React的优势? React的市场情况? 开发环境搭建? 使用create-react-app快速…