Good
Brute force version=> Stack overflow.
import java.lang.reflect.Array; public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { if(numCourses<=1) return true; ArrayList<Integer>[] adjacencyList = (ArrayList<Integer>[])Array.newInstance(ArrayList.class, numCourses); for(int i = 0; i<numCourses; ++i) { adjacencyList[i] = new ArrayList<Integer>(); } boolean[] startingCourses = new boolean[numCourses]; Arrays.fill(startingCourses, true); for(int[] prerequesite: prerequisites) { adjacencyList[prerequesite[1]].add(prerequesite[0]); startingCourses[prerequesite[0]] = false; } //boolean[] startingCourses = new boolean[numCourses]; for(int i = 0; i<numCourses; ++i) { if(startingCourses[i]) { boolean[] visit = new boolean[numCourses]; if(DFS(adjacencyList, i, visit)); return false; } } return true; } //return true=>have cycle. private boolean DFS(ArrayList<Integer>[] adjacencyList, int node, boolean[] visit) { if(visit[node] == true) return true; //have cycle! visit[node] = true; for(int out: adjacencyList[node]) { DFS(adjacencyList, out, visit); visit[out] = false; } return false; } }
原文:http://www.cnblogs.com/neweracoding/p/5246577.html