题目链接:https://www.lanqiao.cn/problems/182/learning/
题目描述:

题目思路:一开始就用dfs去尝试,这个问题可以转化为 循环有向图的判断 ,因为如果能够组成一个崇拜圈,那么在圈中的任何一个节点开始遍历,必然能会到当前节点,我们可以利用这个特性,对每个给定的节点进行尝试,如果当前节点不能构成崇拜圈,那么我们清除遍历的记录,继续尝试下一个节点。如果当前的节点可以构成崇拜圈,那么我们保留此次的遍历记录,因为当我们遍历到这个圈的其他节点时,可以直接跳过不用再遍历一次,这也是一个剪枝的技巧。
import java.util.*;// 1:无需package// 2: 类名必须Main, 不可修改public class Main {static int n;static int ans = 0;static Map<Integer, Integer> graph;static boolean[] visited;static int is_end;static void dfs(int origin, int node, int count){if(origin == node && visited[node]){ans = Math.max(ans, count);is_end = -1;return;}if(visited[node]){return;}visited[node] = true;dfs(origin, graph.get(node), count+1);}public static void main(String[] args) {Scanner scan = new Scanner(System.in);n = scan.nextInt();graph = new HashMap<>();visited = new boolean[n+1];for (int i = 1; i <= n; i++){int next = scan.nextInt();graph.put(i, next);}for(int i = 1; i <= n; i++){if(!visited[i]){is_end = i;dfs(i, i, 0);if (is_end == i){Arrays.fill(visited, false);}}}System.out.println(ans);}}
