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  }