📝

Leetcode 2360

Importance
📙📙
Start Date
Mar 29, 2025 23:25
tags
Graph
Link:

题目要求

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

核心算法和原理

  • 对每个节点维护一个「访问时间」,从第0个结点开始向后遍历,每轮遍历前记录startTime = curTime
  • 在一轮遍历中,每次遍历后curTime++,然后记录访问到这个节点的时间点
  • 一轮遍历持续进行至访问到-1或已经访问过的结点,然后判断当前结点是否不为-1 且 访问时间大于startTime,若是则更新ans
 

代码

class Solution { public: int longestCycle(vector<int>& edges) { int ans = -1; int n = edges.size(); int curTime = 1; vector<int> visitTime(n, 0); for (int i = 0; i < n; i++) { int x = i; int startTime = curTime; while (x != -1 && visitTime[x] == 0) { // not visited visitTime[x] = curTime++; x = edges[x]; } if (x != -1 && visitTime[x] >= startTime) { ans = max(ans, curTime - visitTime[x]); } } return ans; } };