Topological Sorting(Course Schedule)
Course Schedule: https://leetcode.com/problems/course-schedule/#/description
BFS
public class Solution {
/**
* @param numCourses a total of n courses
* @param prerequisites a list of prerequisite pairs
* @return true if can finish all courses or false
*/
public boolean canFinish(int numCourses, int[][] prerequisites) {
// Write your code here
List[] edges = new ArrayList[numCourses];
int[] degree = new int[numCourses];
for (int i = 0;i < numCourses; i++)
edges[i] = new ArrayList<Integer>();
for (int i = 0; i < prerequisites.length; i++) {
degree[prerequisites[i][0]] ++ ;
edges[prerequisites[i][1]].add(prerequisites[i][0]);
}
Queue queue = new LinkedList();
for(int i = 0; i < degree.length; i++){
if (degree[i] == 0) {
queue.add(i);
}
}
int count = 0;
while(!queue.isEmpty()){
int course = (int)queue.poll();
count ++;
int n = edges[course].size();
for(int i = 0; i < n; i++){
int pointer = (int)edges[course].get(i);
degree[pointer]--;
if (degree[pointer] == 0) {
queue.add(pointer);
}
}
}
return count == numCourses;
}
}
DFS
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
ArrayList[] neighbors = new ArrayList[numCourses];
boolean[] visited = new boolean[numCourses];
for(int i = 0; i < numCourses; i++){
neighbors[i] = new ArrayList();
}
for(int i = 0; i < prerequisites.length; i++){
neighbors[prerequisites[i][1]].add(prerequisites[i][0]);
}
int count = 0;
for(int i = 0; i < numCourses; i++){
if(!dfs(neighbors, visited, i)){
return false;
}
}
return true;
}
private boolean dfs(ArrayList[] neighbors, boolean[] visited, int course){
if(visited[course]){
return false;
}
visited[course] = true;
for(int i = 0; i < neighbors[course].size(); i++){
if(!dfs(neighbors, visited, (int)neighbors[course].get(i))){
return false;
}
}
visited[course] = false;
return true;
}
}
Wrong DFS
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
ArrayList[] neighbors = new ArrayList[numCourses];
int[] degrees = new int[numCourses];
boolean[] visited = new boolean[numCourses];
for(int i = 0; i < numCourses; i++){
neighbors[i] = new ArrayList();
degrees[i] = 0;
}
for(int i = 0; i < prerequisites.length; i++){
neighbors[prerequisites[i][1]].add(prerequisites[i][0]);
degrees[prerequisites[i][0]]++;
}
int count = 0;
for(int i = 0; i < numCourses; i++){
if(degrees[i] == 0 && !dfs(neighbors, visited, i)){
return false;
}
}
return true;
}
private boolean dfs(ArrayList[] neighbors, boolean[] visited, int course){
if(visited[course]){
return false;
}
visited[course] = true;
for(int i = 0; i < neighbors[course].size(); i++){
if(!dfs(neighbors, visited, (int)neighbors[course].get(i))){
return false;
}
}
visited[course] = false;
return true;
}
}