【C++DFS 图论 时间戳】2360. 图中的最长环|1897

【C++DFS 图论 时间戳】2360. 图中的最长环|1897

本文涉及知识点

C++图论
C++DFS

LeetCode2360. 图中的最长环

给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边。
图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 i 到节点 edges[i] 之间有一条有向边。如果节点 i 没有出边,那么 edges[i] == -1 。
请你返回图中的 最长 环,如果没有任何环,请返回 -1 。
一个环指的是起点和终点是 同一个 节点的路径。
示例 1:

在这里插入图片描述

输入:edges = [3,3,4,2,3]
输出去:3
解释:图中的最长环是:2 -> 4 -> 3 -> 2 。
这个环的长度为 3 ,所以返回 3 。
示例 2:

在这里插入图片描述


输入:edges = [2,-1,3,1]
输出:-1
解释:图中没有任何环。

提示:
n == edges.length
2 <= n <= 105
-1 <= edges[i] < n
edges[i] != i

DFS

由于有环,所以只能用vis数组(时间戳)出重。
注意:由于有多个连通区域,所以需要DFS多次。
如果再次DFS(cur)看 cur上次的时间戳是否大于等于root的时间戳,如果是,则当前时间戳减去上次时间戳,就是环的长度。
由于出度为1,可以用循环代替。

代码

核心代码

classSolution{public:intlongestCycle(vector<int>& edges){constint N = edges.size();int iTime =1; vector<int>vTime(N);int ans =-1;for(int i =0; i < N; i++){if(vTime[i]>0)continue;int rootTime = iTime;for(int cur = i;-1!= cur; cur = edges[cur]){if(vTime[cur]>0){if(vTime[cur]>= rootTime){ ans =max(ans,iTime - vTime[cur]);}break;} vTime[cur]= iTime++;}}return ans;}};

单元测试

vector<int> edges;TEST_METHOD(TestMethod11){ edges ={3,3,4,2,3};auto res =Solution().longestCycle(edges);AssertEx(3,res);}TEST_METHOD(TestMethod12){ edges ={2,-1,3,1};auto res =Solution().longestCycle(edges);AssertEx(-1, res);}TEST_METHOD(TestMethod13){ edges ={-1,4,-1,2,0,4};auto res =Solution().longestCycle(edges);AssertEx(-1, res);}TEST_METHOD(TestMethod14){ edges ={1,2,0,4,5,6,3,8,9,7};auto res =Solution().longestCycle(edges);AssertEx(4, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步ZEEKLOG学院,听白银讲师(也就是鄙人)的讲解。
https://edu.ZEEKLOG.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.ZEEKLOG.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

Read more

Java 中间件:RocketMQ 顺序消息(全局/分区顺序)

Java 中间件:RocketMQ 顺序消息(全局/分区顺序)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java中间件这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 中间件:RocketMQ 顺序消息(全局 / 分区顺序) * 什么是顺序消息? * RocketMQ 顺序消息的工作原理 * 全局顺序 vs 分区顺序 * RocketMQ 顺序消息的核心机制 * 全局顺序消息的实现 * 全局顺序的配置要求 * Java 代码示例:全局顺序消息 * 全局顺序的局限性 * 分区顺序消息的实现 * 分区顺序的设计思路 * Java 代码示例:分区顺序消息 * 分区顺序的关键要点 * 顺序消息的消费机制详解 * ConsumeOrderlyStatus 枚举 * 消费失败的处理机制 * 并发消费 vs 顺序消费

By Ne0inhk
JAVA 集合框架进阶:Map 接口的深度解析与实战

JAVA 集合框架进阶:Map 接口的深度解析与实战

JAVA 集合框架进阶:Map 接口的深度解析与实战 1.1 本章学习目标与重点 💡 掌握 Map 接口的核心特性,理解 Key-Value 键值对的存储结构与设计思想。 💡 熟练掌握 HashMap、LinkedHashMap、TreeMap 等实现类的底层原理与适用场景。 💡 理解 Map 集合的线程安全问题,掌握并发环境下的解决方案。 ⚠️ 本章重点是 HashMap 的底层实现原理 和 不同 Map 实现类的性能对比,这是面试和开发中的高频核心考点。 1.2 Map 接口核心概述 1.2.1 Map 接口的定义与特性 💡 Map 是一种键值对(Key-Value) 集合,它的核心是通过键(Key)来唯一标识值(Value)。 Map 接口中的 Key

By Ne0inhk
人工智能顶会巡礼:NeurIPS, ICML, ICLR 的风格差异与投稿选择

人工智能顶会巡礼:NeurIPS, ICML, ICLR 的风格差异与投稿选择

点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 人工智能顶会巡礼:NeurIPS, ICML, ICLR 的风格差异与投稿选择 引言:在巨人的殿堂前——抉择的十字路口 对于身处人工智能与机器学习浪潮之巅的研究者而言,每年下半年至次年春天的“顶会赛季”,都是一场关乎声誉、职业发展乃至学术影响力的关键战役。在这场战役中,NeurIPS (Conference on Neural Information Processing Systems)、ICML (International Conference on Machine Learning) 和 ICLR (International Conference on Learning Representations) 无疑是三座最宏伟、也最令人向往的学术殿堂。向其中任何一座殿堂成功叩关,都标志着工作获得了国际顶级同行的认可。 然而,随着一篇篇论文被精心打磨完成,一个至关重要且令人纠结的问题便会浮现:“我这篇工作,

By Ne0inhk
2026年AI Agent实战:从玩具到生产力的落地手册(附源码)

2026年AI Agent实战:从玩具到生产力的落地手册(附源码)

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” * 前言 * 目录 * 一、AI Agent 的核心架构 * 1.1 什么是AI Agent? * 1.2 2026年Agent技术栈全景 * 二、从零搭建生产级Agent框架 * 2.1 项目结构设计 * 2.2 核心代码:Agent基类 * 2.3 记忆管理系统 * 三、三大核心技术实现 * 3.1 ReAct框架:推理+行动协同 * 3.2 工具调用系统 * 3.3 任务规划器 * 四、实战案例:智能客服Agent * 4.1 场景分析

By Ne0inhk