This course treats various methods to design and analyze datastructures and algorithms for a wide range of problems. The most important new datastructure treated is the graph, and the general methods introduced are: greedy algorithms, divide and conquer, dynamic programming and network flow algorithms. These general methods are explained by a number of concrete examples, such as simple scheduling algorithms, Dijkstra, Ford-Fulkerson, minimum spanning tree, closest-pair-of-points, knapsack, and Bellman-Ford. Throughout this course there is significant attention to proving the correctness of the discussed algorithms. All material for this course is in English. The recorded lectures, however, are in Dutch.