github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/leetcode/course-schedule_test.go (about) 1 package leetcode 2 3 import "testing" 4 5 //207. 课程表 https://leetcode-cn.com/problems/course-schedule/ 6 // 拓扑排序问题,判断有向图环的问题库 使用kahn算法 7 8 func canFinish(numCourses int, prerequisites [][]int) bool { 9 if len(prerequisites) < 1 { 10 return true 11 } 12 13 inDegree := make([]int, numCourses) // 入度的数量 14 nextCourses := make([][]int, numCourses) 15 16 for i := range prerequisites { 17 from := prerequisites[i][1] 18 to := prerequisites[i][0] 19 inDegree[to]++ 20 nextCourses[from] = append(nextCourses[from], to) 21 } 22 var que []int 23 for course := range inDegree { 24 if inDegree[course] == 0 { 25 que = append(que, course) 26 } 27 } 28 if len(que) == 0 { 29 return false 30 } 31 cnt := 0 32 for len(que) > 0 { 33 course := que[0] 34 que = que[1:] 35 cnt++ 36 if nextCourses[course] != nil { 37 for _, toCourse := range nextCourses[course] { 38 inDegree[toCourse]-- 39 if inDegree[toCourse] == 0 { 40 que = append(que, toCourse) 41 } 42 } 43 } 44 } 45 return cnt == numCourses 46 } 47 48 func TestCanFinish(t *testing.T) { 49 tests := []struct { 50 arg1 int 51 arg2 [][]int 52 want bool 53 }{ 54 {3, [][]int{{1, 0}, {2, 1}}, true}, 55 {4, [][]int{{1, 0}, {2, 0}, {3, 1}, {3, 2}}, true}, 56 } 57 for _, tt := range tests { 58 if got := canFinish(tt.arg1, tt.arg2); got != tt.want { 59 t.Errorf("canFinish() => got=%v want=%v", got, tt.want) 60 } 61 } 62 }