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; } };
