https://people.cs.pitt.edu/~milos/courses/cs441/lectures/Class16.pdf