思路:
先判断有没有环,再进行拓扑排序。
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]+" ");
}
}
}
本文探讨了如何使用算法解决课程调度问题,并通过拓扑排序进行课程安排。详细介绍了课程调度类的实现,包括环检测、拓扑排序算法及如何找到课程的最优顺序。通过实例演示了算法的应用过程。
8995

被折叠的 条评论
为什么被折叠?



