TLE 以下代码,采用dfs来判断是否会出现循环
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//fast and slow point.
//dfs.
if(numCourses<=1) return true;
List<Set<Integer>> graph = new ArrayList<Set<Integer>>();
for(int i=0;i<numCourses;i++) graph.add(new HashSet<Integer>());
for(int[] edge:prerequisites){
graph.get(edge[1]).add(edge[0]);
}
List<Integer> early = new ArrayList<Integer>();
for(int i=0;i<numCourses;i++){
if(graph.get(i).size()>0) early.add(i);
}
boolean res = true; // no circle
for(int i:early){
List<Integer> tmp = new ArrayList<Integer>();
res = iscircle(i,graph,tmp);
if(!res){ // exists circle
break;
}
}
return res;
}
private boolean iscircle(int i, List<Set<Integer>> graph, List<Integer> tmp) {
// TODO Auto-generated method stub
//tmp.add(i);
if(tmp.contains(i)) return false;
// two point: k,h
// int k=i, h=i;
boolean res = true;
Set<Integer> nexti = new HashSet<Integer>(graph.get(i));
for(int j: nexti){
graph.get(i).remove(j);
tmp.add(i);
res = iscircle(j,graph,tmp); //dfs
graph.get(i).add(j);
tmp.remove(tmp.size()-1);
if(!res){
break;
}
}
return res;
}
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//fast and slow point.
//dfs.
if(numCourses<=1) return true;
List<Set<Integer>> graph = new ArrayList<Set<Integer>>();
for(int i=0;i<numCourses;i++) graph.add(new HashSet<Integer>());
for(int[] edge:prerequisites){
graph.get(edge[1]).add(edge[0]);
}
List<Integer> early = new ArrayList<Integer>();
for(int i=0;i<numCourses;i++){
if(graph.get(i).size()>0) early.add(i);
}
boolean res = true; // no circle
for(int i:early){
List<Integer> tmp = new ArrayList<Integer>();
res = iscircle(i,graph,tmp);
if(!res){ // exists circle
break;
}
}
return res;
}
private boolean iscircle(int i, List<Set<Integer>> graph, List<Integer> tmp) {
// TODO Auto-generated method stub
//tmp.add(i);
if(tmp.contains(i)) return false;
// two point: k,h
// int k=i, h=i;
boolean res = true;
for(int j: graph.get(i)){
//graph.get(i).remove(j);
tmp.add(i);
res = iscircle(j,graph,tmp); //dfs
tmp.remove(tmp.size()-1);
if(!res){
break;
}
}
return res;
}
}
easy bfs java solution
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Set;
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[][] matrix = new int[numCourses][numCourses]; // i -> j
int[] indegree = new int[numCourses];
for (int i=0; i<prerequisites.length; i++) {
int ready = prerequisites[i][0];
int pre = prerequisites[i][1];
if (matrix[pre][ready] == 0)
indegree[ready]++; //duplicate case
matrix[pre][ready] = 1;
}
int count = 0;
Queue<Integer> queue = new LinkedList();
for (int i=0; i<indegree.length; i++) {
if (indegree[i] == 0) queue.offer(i);
}
while(!queue.isEmpty()) {
int course = queue.poll();
count++;
for (int i=0; i<numCourses; i++) {
if (matrix[course][i] != 0) {
if (--indegree[i] == 0)
queue.offer(i);
}
}
}
return count == numCourses;
}
}