private bool orderCourses(CourseGraph graph, int numCourse, int[][] prerequisites) { int numDependencies = prerequisites.Count(); List <CourseGraphNode> nodes = graph.nodes; CourseGraphNode[] courses = new CourseGraphNode[nodes.Count]; //Cpature all courses which doesn't have any prerequisites int endOfList = addNodesWithNoDependencies(courses, nodes, 0); int toBeProcessed = 0; while (toBeProcessed < courses.Length) { var course = courses[toBeProcessed]; //Circular dependency detected if (course == null) { return(false); } //remove current element from dependency List <CourseGraphNode> children = course.children; foreach (var child in children) { //remove edge from removed node and child nodes child.decrementDependencies(); } //Add childrens that has no dependent nodes endOfList = addNodesWithNoDependencies(courses, children, endOfList); toBeProcessed++; } return(true); }
private CourseGraph buildGraph(int[][] dependencies) { CourseGraph graph = new CourseGraph(); //Build dependencies of each graph indices from dependencies matrix foreach (var dependency in dependencies) { var preCourse = graph.getOrCreateNode(dependency[1]); var nextCourse = graph.getOrCreateNode(dependency[0]); graph.addEdge(nextCourse, preCourse); } return(graph); }
public bool CanFinish(int numCourses, int[][] prerequisites) { if (prerequisites == null || prerequisites.Count() == 0) { return(true); } //Step1: Build Graph from Vertices and Dependencies //Here, [a, b] => b is a prerequisite of a //To take a, you have to complete b CourseGraph graph = buildGraph(prerequisites); return(orderCourses(graph, numCourses, prerequisites)); }