Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
        }