Week 1:
Jan 7: Introduction, Order notation, Growth of functions:
    Introduction to Running time analysis [Sec 2.2]
    Asymptotic notation (Big oh, Theta, Omega) [Sec 3.1]
    Logs and polynomials [Sec 3.2]
    Summations of arithmetic and geometric series [Appendix A]

Jan 9: Recurrences and Solution techniques
    Iteration method, Substitution method, (Simplified) Master method,
    Applications of Master method [Chapter 4].
    Proof techniques: Induction, Contradiction, Contrapositive,
    Counterexample, and Construction.
    Bounding summations: upper bound by bounding each term, and lower
    bound by splitting the sum and bouding the upper half, and
    Approximation by integrals [Appendix A.2].

Week 2:
Jan 14: Divide-and-conquer method:
    Proofs of correctness of loops using loop invariants,
    Correctness of Merge (in Merge sort) and Partition (in Quick sort)
    procedures.  Correctness and Running time analysis of Merge sort.

Jan 16: Quick sort algorithm.
    Selection problem (finding kth smallest element): DAC algorithm
    using Partition of Quick sort.  Expected running time of Quick sort
    is O(n log n) and randomized select is O(n).

Week 3:
Jan 23: Overview of sorting, Linear time sorting
    algorithms for special inputs (Counting sort, Radix sort, Bucket sort),
    n log n lower bound for comparison based sorting using decision trees.

Week 4:
Jan 28 Dynamic programming (Dr. Chandrasekaran)
Jan 30 Dynamic programming (Dr. Chandrasekaran)

Week 5:
Feb 04 Dynamic programming (Dr. Chandrasekaran)

Feb 6: Discussion of Assignment 1, Memoization example.

Week 6:
Feb 11: Review.
Feb 13: Exam 1.

Week 7:
Feb 18 Activity selection problem: DP and greedy algorithm.

Feb 20 Huffman coding problem.

Week 8:
Feb 25 Graphs: terms, adjacency lists and adjacency matrices. 
    Depth-first search (DFS) algorithm; finding the topological ordering of the vertices of a DAG.

Feb 27 Properties of DFS: life times of vertices,
    Parenthesis property, white path theorem.  Classification of edges into
    tree/back/forward/cross edges based on DFS.  Proof of correctness of
    DFS-based topological sort algorithm.  Bridges and cut vertices in an
    undirected graph.  Sample execution to find bridges and cut vertices.

Week 9:
Mar 3 Finding bridges and cut vertices.  BFS.

Mar 5 Identifying bipartite graphs using BFS.

Week 10:
Mar 17: Review
Mar 19: Exam 2

Week 11:
Mar 24 Minimum spanning trees: greedy algorithms.

Mar 26 Minimum spanning trees: proof of correctness, Implementation of Prim's algorithm.

Week 12:
Mar 31 Minimum spanning trees: Implementation of Kruskal's algorithm, Disjoint set Union/Find data structure.

Apr 2 Single-source shortest paths problem; Bellman-Ford Algorithm.

Week 13:
Apr 7 SSSP: Dijkstra's algorithm, example, proof of correctness.  A recurrence for ll-pairs shortest paths

Apr 9 Algorithms for APSP.

Week 14:
Apr 14 Floyd-Warshall example, detecting negative cycles, Maximum flow problem example.

Apr 16 DAG-shortest paths, Proof of correcteness of maximum flow algorithm.

Week 15:
Apr 21 Extensions and applications of maximum flow.

Apr 23 NP-completeness, 3-CNF-SAT to Clique, Clique to Vertex cover reductions.

Week 16:
Apr 28 Final exam review.