May LeetCoding Challenge29 之 拓扑排序

本题是一个很经典的图论问题,可以简化为判断有向图是否有环。

class Solution {
    private Map<Integer, List<Integer>> graph= new HashMap<>();
    private int[] visited;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        for(int[] edge: prerequisites){
            graph.putIfAbsent(edge[1], new ArrayList<>());
            graph.get(edge[1]).add(edge[0]);
        }
        // states: 0 = unknown, 1 == visiting, 2 = visited
        visited = new int[numCourses];
        for(int node = 0; node < numCourses; node++){
            if(visited[node] == 0 && isCycle(node))
                return false;
        }
        return true;
    }
    public boolean isCycle(int cur){
        if(visited[cur] == 1) return true;
        if(visited[cur] == 2) return false;
        if(!graph.containsKey(cur)) return false;
        //bug 先返回 再赋值
        visited[cur] = 1;
        for(int next: graph.get(cur)){
            if(isCycle(next)) return true;
        }
        visited[cur] = 2;
        return false;
    }
}
原文地址:https://www.cnblogs.com/yawenw/p/13034191.html