123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- // Will visit, visiting, visited
- const (
- WILL = iota
- ING
- ED
- )
- func canFinish(numCourses int, prerequisites [][]int) bool {
- adj := make([][]bool, numCourses)
- for i := range adj {
- adj[i] = make([]bool, numCourses)
- }
- for i := range prerequisites {
- adj[prerequisites[i][0]][prerequisites[i][1]] = true
- }
- tag := make([]int, numCourses)
- hasRing := false
- for i := 0; i < numCourses; i++ {
- dfs(i, adj, &tag, &hasRing)
- if hasRing {
- return false
- }
- }
- return true
- }
- func dfs(x int, adj [][]bool, tag *[]int, hasRing *bool) {
- if *hasRing || (*tag)[x] == ED {
- return
- }
- (*tag)[x] = ING
- for i := range adj[x] {
- if !adj[x][i] {
- continue
- }
- if (*tag)[i] == WILL {
- dfs(i, adj, tag, hasRing)
- } else if (*tag)[i] == ING {
- *hasRing = true
- return
- }
- }
- (*tag)[x] = ED
- }
|