华为机试0406 第二题(DFS)

DFS版本 思路:

    DFS 判断是否有环,只要一条路径有环就不行,直接返回输出-1; 在 DFS 过程中使用 TreeSet 记录所有依赖点即可,如果不存在环,就是所有的依赖点了。
package huawei.oj_0406;

import java.util.*;

public class Solution2 {
          
   
    private static boolean haveLoop = false;
    private static Set<Integer> dependments;
    private static int m;
    public static void main(String[] args) {
          
   
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        m = Integer.parseInt(sc.nextLine());
        List<Integer>[] parents = new List[n];
        for(int i = 0; i < n; i++){
          
   
            parents[i] = new ArrayList<>();
            String[] strs = sc.nextLine().split(",");
            int k = Integer.parseInt(strs[0]);
            for(int j = 1; j <= k; j++)
                parents[i].add(Integer.parseInt(strs[j]));
        }

        dependments = new TreeSet<>();
        dfs(parents, m, new boolean[n]);
        if(haveLoop)
            System.out.println(-1);
        else{
          
   
            Integer[] res = dependments.toArray(new Integer[0]);
            System.out.print(res[0]);
            for(int i = 1; i < res.length; i++)
                System.out.print("," + res[i]);
        }
    }

    private static void dfs(List<Integer>[] parents, int i, boolean[] visited){
          
   
        if(visited[i] == true){
          
   
            haveLoop = true;
            return;
        }
        if(!haveLoop){
          
   
            if(m != i)
                dependments.add(i);
            visited[i] = true;
            for(int j : parents[i])
                dfs(parents, j, visited);
            visited[i] = false;
        }
    }
}
经验分享 程序员 微信小程序 职场和发展