# 2360. Longest Cycle in a Graph ###### tags: `Leetcode` `Hard` `DFS` Link: https://leetcode.com/problems/longest-cycle-in-a-graph/description/ ## 思路 和[2359. Find Closest Node to Given Two Nodes](https://hackmd.io/rkWcS36jRWuZoBmKRuZH9g)差不多 由于每个点最多只有一个outgoing edge 其实这个图就像是一个linkedlist, current node和next node直接是straightforward的 不需要像之前一样做bfs/dfs 所以对于每个点我们顺着路线找一遍 并且把中途经历过的所有点visited设成true 如果我们在dfs的过程中碰到了之前碰到的点说明我们不用往下找了 如果我们碰到在这次dfs中遇到的点 说明有cycle cycle的大小我们只需要维持一个dist variable 记录我们到每个点走了多少距离 相减即可得到cycle的大小 一开始写的方法会TLE, 原因是对于每个node我们都有可能重新建一个memo array 然后initialize它 所以时间复杂度变成了$O(N^2)$ 解决方法是 1. 用map存memo 参考[这里](https://leetcode.com/problems/longest-cycle-in-a-graph/solutions/2357650/java-dfs-hashmap/?orderBy=most_votes) 2. global memo 参考[这里](https://leetcode.com/problems/longest-cycle-in-a-graph/solutions/2357631/dfs/?orderBy=most_votes) global memo 除了记录dist之外还要记录这个点是从哪个点开始的dfs visit到的 到了一个点发现已经visited了 并且是dfs的起始点是一样的 说明我们需要记录这个cycle 否则就不用记录 ## Code Global Memo写法 ```java= class Solution { public int longestCycle(int[] edges) { int ans = -1; int n = edges.length; int[][] memo = new int[n][2]; for(int i=0; i<n; i++) Arrays.fill(memo[i], -1); for(int i=0; i<n; i++){ for(int j=i, dist=0; j!=-1; j=edges[j]){ int[] cur = memo[j]; if(cur[0]==-1) memo[j]=new int[]{dist++, i}; else{ if(cur[1]==i) ans = Math.max(ans, dist-cur[0]); break; } } } return ans; } } ``` TLE写法 ```java= class Solution { public int longestCycle(int[] edges) { int n = edges.length; int longest = -1; boolean[] visited = new boolean[n]; for(int i=0; i<n; i++){ if(visited[i]) continue; longest = Math.max(longest, dfs(i, visited, edges)); visited[i] = true; } return longest; } public int dfs(int node, boolean[] visited, int[] edges){ int dist = 0; int n = edges.length; int[] memo = new int[n]; Arrays.fill(memo, -1); while(node!=-1 && memo[node]==-1 && !visited[node]){ //if node has been visited, any cycle this node can arrive has been counted visited[node] = true; memo[node] = dist++; node = edges[node]; } if(node!=-1) return dist-memo[node]; else return -1; } } ```