图论

207、课程表

class Solution {
    public List<Integer>[] edges;
    public int[] ls;
    public boolean flag = true;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        edges = new List[numCourses];
        for(int i = 0; i < numCourses; i++){
            edges[i] = new ArrayList<Integer>();
        }
        for(int i = 0; i < prerequisites.length; i++){
            edges[prerequisites[i][0]].add(prerequisites[i][1]);
        }
        ls = new int[numCourses];
        for(int i = 0; i < numCourses; i++){
            if(ls[i]==0){
                dfs(i);
                if(!flag){
                    return false;
                }
            }            
            
        }
        return true;
    }
    public void dfs(int index){
        ls[index] = 1;
        List<Integer> edge = edges[index];
        for(Integer integer : edge){
            if(ls[integer]==1){
                flag = false;
                return;
            }else if(ls[integer]==0){
                dfs(integer);
            }
        }
        ls[index]=2;
    }
}

210、课程表 II

class Solution {
    public List<Integer>[] edges;
    public int[] visited;
    public boolean flag = true;
    public int[] result;
    public int score;
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        edges = new List[numCourses];
        for(int i = 0; i < numCourses; i++){
            edges[i] = new ArrayList<>();
        }
        for(int i = 0; i < prerequisites.length; i++){
            edges[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        visited = new int[numCourses];
        result = new int[numCourses];
        score = numCourses-1;
        for(int i = 0; i < numCourses; i++){
            if(visited[i]==0){
                dfs(i);
                if(!flag){
                    return new int[0];
                }
            }
            
        }
        return result;
    }
    public void dfs(int index){
        visited[index] = 1;
        List<Integer> edge = edges[index];
        for(Integer integer : edge){
            if(visited[integer]==0){
                dfs(integer);
                if(!flag){
                    return;
                }
            }else if(visited[integer]==1){
                flag = false;
                return;
            }
        }
        visited[index]=2;
        result[score--]=index;
    }
}

1462、课程表 IV

class Solution {
    public List<Integer>[] edges;
    public int[] visited;
    public HashSet<Integer>[] set;
    public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {
        edges = new List[numCourses];
        set = new HashSet[numCourses];
        for(int i = 0;i < numCourses; i++){
            edges[i] = new ArrayList<>();
            set[i] = new HashSet<>();
        }
        for(int i = 0;i < prerequisites.length; i++){
            edges[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        visited = new int[numCourses];
        
        for(int i = 0;i < queries.length; i++){
            dfs(queries[i][1], queries[i][0]);
        }
        List<Boolean> result = new ArrayList<>();
        for(int[] i: queries){
            int from = i[1];
            int to = i[0];
            result.add(set[from].contains(to));
        }
        return result;
    }
    public void dfs(int left, int right){
        visited[left] = 1;
        List<Integer> edge = edges[left];
        for(Integer integer : edge){
            if(visited[integer] == 0){
                dfs(integer, right);
            }
            set[left].add(integer);
            set[left].addAll(set[integer]);
        }
        
    }
}

[剑指 Offer II 113]、(https://leetcode.cn/problems/QA2IGt/) 课程顺序

class Solution {
    public List<Integer>[] edges;
    public int[] result;
    public int score;
    public int[] visited;
    public boolean flag = true;
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        edges = new List[numCourses];
        for(int i = 0; i < numCourses; i++){
            edges[i] = new ArrayList<>();
        }
        for(int i = 0;i < prerequisites.length; i++){
            edges[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        result = new int[numCourses];
        score = numCourses - 1;
        visited = new int[numCourses];
        for(int i = 0;i < numCourses; i++){
            if(visited[i]==0){
                dfs(i);
                if(!flag){
                    return new int[0];
                }
            }
        }
        return result;
    }
    public void dfs(int index){
        visited[index] = 1;
        List<Integer> edge = edges[index];
        for(Integer integer : edge){
            if(visited[integer] == 0){
                dfs(integer);
                if(!flag){
                    return;
                }
            }else if(visited[integer] == 1){
                flag = false;
                return;
            }
        }
        visited[index] = 2;
        result[score--] = index;
    }
}
posted @ 2023-04-16 11:24  novice_programmer_oo  阅读(18)  评论(0)    收藏  举报