Skip to content

Instantly share code, notes, and snippets.

@bryangarza
Last active March 27, 2016 22:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bryangarza/4346ceb9b361f377d55d to your computer and use it in GitHub Desktop.
Save bryangarza/4346ceb9b361f377d55d to your computer and use it in GitHub Desktop.
import java.util.*;
import java.lang.*;
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
return !hasCycle(numCourses, prerequisites);
}
private boolean hasCycle(int numCourses, int[][] prerequisites) {
List<Integer>[] g = constructGraph(numCourses, prerequisites);
Set<Integer> whiteSet = new HashSet<>();
Set<Integer> greySet = new HashSet<>();
Set<Integer> blackSet = new HashSet<>();
for (int i = 0; i < g.length; i++) {
if (g[i] != null) {
whiteSet.add(i);
}
}
while (whiteSet.size() > 0) {
Integer cur = whiteSet.iterator().next();
if (dfs(cur, g, whiteSet, greySet, blackSet)) {
return true;
}
}
return false;
}
private boolean dfs(int edge,
List<Integer>[] g,
Set<Integer> whiteSet,
Set<Integer> greySet,
Set<Integer> blackSet) {
moveVertex(edge, whiteSet, greySet);
List<Integer> nodes;
int n;
if (g[edge] != null) {
nodes = g[edge];
for (int i = 0; i < nodes.size(); i++) {
n = nodes.get(i);
if (blackSet.contains(n)) {
continue;
}
if (greySet.contains(n)) {
return true;
}
if (dfs(n, g, whiteSet, greySet, blackSet)) {
return true;
}
}
}
moveVertex(edge, greySet, blackSet);
return false;
}
private void moveVertex(int edge,
Set<Integer> s1,
Set<Integer> s2) {
s1.remove(edge);
s2.add(edge);
}
private List<Integer>[] constructGraph(int numCourses, int[][] edges) {
int a;
int b;
List<Integer>[] g = (List<Integer>[])new ArrayList[numCourses];
for (int i = 0; i < edges.length; i++) {
a = edges[i][1];
b = edges[i][0];
if (g[a] == null) {
g[a] = new ArrayList<>();
}
g[a].add(b);
}
return g;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment