天天看點

leetcode--CourseScheduleII

思路:

先判斷有沒有環,再進行拓撲排序。

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * Created by marsares on 15/6/24.
 */
public class CourseScheduleII {
    List<Integer>[]adj;
    boolean[] marked;
    Stack<Integer>stack=new Stack<Integer>();
    boolean[]marked1;
    boolean[]onStack;
    boolean canFinish=true;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        adj=new List[numCourses];
        for(int i=0;i<numCourses;i++){
            adj[i]=new ArrayList<Integer>();
            marked1=new boolean[numCourses];
            onStack=new boolean[numCourses];
        }
        for(int i=0;i<prerequisites.length;i++){
            int from=prerequisites[i][0];
            int to=prerequisites[i][1];
            adj[from].add(to);
        }
        for(int i=0;i<numCourses;i++)dfs1(i);
        return canFinish;
    }
    public void dfs1(int v){
        if(!canFinish)return;
        marked1[v]=true;
        onStack[v]=true;
        for(int w:adj[v]){
            if(!marked1[w])dfs1(w);
            else if(onStack[w])canFinish=false;
        }
        onStack[v]=false;
    }
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        if(!canFinish(numCourses,prerequisites))return new int[0];
        marked=new boolean[numCourses];
        for(int i=0;i<numCourses;i++){
            adj[i]=new ArrayList<Integer>();
            marked[i]=false;
        }
        for(int i=0;i<prerequisites.length;i++){
            adj[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        for(int i=0;i<numCourses;i++){
            if(!marked[i])dfs(i);
        }
        int[]order=new int[numCourses];
        for(int i=0;i<numCourses;i++){
            order[i]=stack.pop();
        }
        return order;
    }
    public void dfs(int v){
        marked[v]=true;
        for(int w:adj[v]){
            if(!marked[w])dfs(w);
        }
        stack.push(v);
    }
    public static void main(String[]args){
        CourseScheduleII csii=new CourseScheduleII();
        int[][]prerequisites={{1,0},{0,1}};
        int[]order=csii.findOrder(4,prerequisites);
        for(int i=0;i<order.length;i++){
            System.out.print(order[i]+" ");
        }
    }
}