1
+ use std:: collections:: HashMap ;
2
+ use std:: collections:: HashSet ;
3
+ use std:: collections:: VecDeque ;
4
+
1
5
/// There are a total of `numCourses` courses you have to take, labeled from
2
6
/// `0` to `numCourses - 1`. You are given an array `prerequisites` where
3
7
/// `prerequisites[i] = [ai, bi]` indicates that you must take course `bi`
@@ -11,9 +15,53 @@ struct Solution;
11
15
12
16
impl Solution {
13
17
14
- // TODO: Implement
15
- pub fn can_finish ( _num_courses : i32 , _prerequisites : Vec < Vec < i32 > > ) -> bool {
16
- false
18
+ pub fn can_finish ( num_courses : i32 , prerequisites : Vec < Vec < i32 > > ) -> bool {
19
+ let n = num_courses as usize ;
20
+
21
+ let mut in_degrees = vec ! [ 0 ; n] ;
22
+ let mut out_degrees = vec ! [ 0 ; n] ;
23
+ let mut prereq_for = HashMap :: new ( ) ;
24
+
25
+ for p in prerequisites {
26
+ let prereq = p[ 1 ] as usize ;
27
+ let for_class = p[ 0 ] as usize ;
28
+ prereq_for
29
+ . entry ( prereq)
30
+ . or_insert ( HashSet :: new ( ) )
31
+ . insert ( for_class) ;
32
+ out_degrees[ prereq] += 1 ;
33
+ in_degrees[ for_class] += 1 ;
34
+ }
35
+
36
+ let mut seen = HashSet :: new ( ) ;
37
+ let mut queue = VecDeque :: new ( ) ;
38
+
39
+ for i in 0 ..n {
40
+ if in_degrees[ i] == 0 {
41
+ queue. push_back ( i) ;
42
+ seen. insert ( i) ;
43
+ }
44
+ }
45
+
46
+ while !queue. is_empty ( ) {
47
+ let current = queue. pop_front ( ) . unwrap ( ) ;
48
+ match prereq_for. get ( & current) {
49
+ Some ( classes) => {
50
+ for & class in classes {
51
+ if !seen. contains ( & class) {
52
+ in_degrees[ class] -= 1 ;
53
+ if in_degrees[ class] == 0 {
54
+ queue. push_back ( class) ;
55
+ seen. insert ( class) ;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ None => { }
61
+ }
62
+ }
63
+
64
+ seen. len ( ) == n
17
65
}
18
66
19
67
}
@@ -22,7 +70,6 @@ impl Solution {
22
70
mod tests {
23
71
use super :: Solution ;
24
72
25
- #[ ignore]
26
73
#[ test]
27
74
fn example_1 ( ) {
28
75
let num_courses = 2 ;
@@ -31,7 +78,6 @@ mod tests {
31
78
assert ! ( result) ;
32
79
}
33
80
34
- #[ ignore]
35
81
#[ test]
36
82
fn example_2 ( ) {
37
83
let num_courses = 2 ;
@@ -40,4 +86,16 @@ mod tests {
40
86
assert ! ( !result) ;
41
87
}
42
88
89
+ #[ test]
90
+ fn sedgewick_example ( ) {
91
+ let num_courses = 13 ;
92
+ let prerequisites = vec ! [
93
+ vec![ 0 , 2 ] , vec![ 1 , 0 ] , vec![ 3 , 2 ] , vec![ 4 , 5 ] , vec![ 4 , 6 ] , vec![ 5 , 0 ] , vec![ 5 , 3 ] ,
94
+ vec![ 6 , 7 ] , vec![ 7 , 8 ] , vec![ 9 , 6 ] , vec![ 10 , 9 ] , vec![ 11 , 9 ] , vec![ 12 , 9 ] , vec![ 12 , 11 ]
95
+ ] ;
96
+
97
+ let result = Solution :: can_finish ( num_courses, prerequisites) ;
98
+ assert ! ( result) ;
99
+ }
100
+
43
101
}
0 commit comments