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

    题目思路:一开始就用dfs去尝试,这个问题可以转化为 循环有向图的判断 ,因为如果能够组成一个崇拜圈,那么在圈中的任何一个节点开始遍历,必然能会到当前节点,我们可以利用这个特性,对每个给定的节点进行尝试,如果当前节点不能构成崇拜圈,那么我们清除遍历的记录,继续尝试下一个节点。如果当前的节点可以构成崇拜圈,那么我们保留此次的遍历记录,因为当我们遍历到这个圈的其他节点时,可以直接跳过不用再遍历一次,这也是一个剪枝的技巧。

    1. import java.util.*;
    2. // 1:无需package
    3. // 2: 类名必须Main, 不可修改
    4. public class Main {
    5. static int n;
    6. static int ans = 0;
    7. static Map<Integer, Integer> graph;
    8. static boolean[] visited;
    9. static int is_end;
    10. static void dfs(int origin, int node, int count){
    11. if(origin == node && visited[node]){
    12. ans = Math.max(ans, count);
    13. is_end = -1;
    14. return;
    15. }
    16. if(visited[node]){
    17. return;
    18. }
    19. visited[node] = true;
    20. dfs(origin, graph.get(node), count+1);
    21. }
    22. public static void main(String[] args) {
    23. Scanner scan = new Scanner(System.in);
    24. n = scan.nextInt();
    25. graph = new HashMap<>();
    26. visited = new boolean[n+1];
    27. for (int i = 1; i <= n; i++){
    28. int next = scan.nextInt();
    29. graph.put(i, next);
    30. }
    31. for(int i = 1; i <= n; i++){
    32. if(!visited[i]){
    33. is_end = i;
    34. dfs(i, i, 0);
    35. if (is_end == i){
    36. Arrays.fill(visited, false);
    37. }
    38. }
    39. }
    40. System.out.println(ans);
    41. }
    42. }