Course Schedule

Problem Statement

There are a total of numCourses courses you have to take, labeled from 0 to numCourses - 1. You are given an array prerequisites where prerequisites[i] = [ai, bi] indicates that you must take course bi first if you want to take course ai.

  • For example, the pair [0, 1], indicates that to take course 0 you have to first take course 1.

Return true if you can finish all courses. Otherwise, return false.

Example 1:

Input: numCourses = 2, prerequisites = [[1,0]]
Output: true
Explanation: There are a total of 2 courses to take. 
To take course 1 you should have finished course 0. So it is possible.

Example 2:

Input: numCourses = 2, prerequisites = [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take. 
To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

Constraints:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • All the pairs prerequisites[i] are unique.

Golang Solution

DFS

type edge struct {
	source      int
	destination int
}

func createEdge(graph map[int][]edge, s, d int) {
	graph[s] = append(graph[s], edge{
		source:      s,
		destination: d,
	})
}

func createGraph() map[int][]edge {
	graph := map[int][]edge{}
	return graph
}

func topoSort(graph map[int][]edge, visited []bool, current int, recursion []bool) bool {
	visited[current] = true
	recursion[current] = true

	for _, edge := range graph[current] {
		if recursion[edge.destination] {
			return true
		}

		if !visited[edge.destination] {
			isCyclePresent := topoSort(graph, visited, edge.destination, recursion)
			if isCyclePresent {
				return true
			}
		}
	}

	recursion[current] = false
	return false
}

func canFinish(numCourses int, preRequisites [][]int) bool {
	visited := make([]bool, numCourses)
	recursion := make([]bool, numCourses)

	graph := createGraph()

	for _, edge := range preRequisites {
		createEdge(graph, edge[1], edge[0])
	}

	for i := 0; i < numCourses; i++ {
		if !visited[i] {
			isCyclePresent := topoSort(graph, visited, i, recursion)
			// early return for cycle detection
			if isCyclePresent {
				return false
			}
		}
	}

	return true
}

Output


func main() {

	numCourses := 2
	preRequisites := [][]int{
		{0, 1},
		//{1, 0},
	}

	ans := canFinish(numCourses, preRequisites)
	fmt.Printf("Answer=%t\n", ans)
}

true

Leave a Reply

Your email address will not be published. Required fields are marked *