思路:
先判斷有沒有環,再進行拓撲排序。
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]+" ");
}
}
}